Текст метки не обновляется в форме, созданной из библиотеки DLL

#c# #winforms #dll #visual-studio-2015 #label

#c# #winforms #dll #visual-studio-2015 #метка

Вопрос:

Я загрузил форму Windows из .dll, и она отображается правильно, и я могу выполнять методы, созданные в этой .dll.

Главное окно с открытым окном Form1 (из библиотеки dll)

Обратите внимание на текстовую метку в окне Form1. В моем главном окне я нажимаю debug, затем выбираю опцию, которая должна изменить текстовую метку на другую строку. Однако строка отказывается меняться. Я проверил, что метод в Form1 запущен, и что label.text был изменен, но отображение никогда не меняется.

ПРИМЕЧАНИЕ: Это также происходит с другими элементами управления, которые я тестировал (textbox / listbox и т.д.).

 public void Command(string cmd, string param1, string param2, string param3)
        {
            if (cmd == "TEST")
            {
                this.label1.Text = "This should now change";
                MessageBox.Show("DONE");
            }
        }
  

Окно сообщения отображается как ожидалось, label.text изменился, и все события запускаются корректно (я создал событие click для метки, которое работает), просто кажется, что метка на самом деле не обновляется. Я также пытался использовать обновление для метки.

Еще один вопрос, если возможно 🙂 Есть ли конкретный способ, которым я могу создать обратный вызов в основной форме, который я могу предоставить Form1? Какой-то делегат, я полагаю?

Я загружаюсь из библиотеки dll таким образом

     try
    {
        Type interfaceType = typeof(IPlugin);
        // Fetch all the types that implement the interface IPlugin and are a class
        Type[] types = AppDomain.CurrentDomain.GetAssemblies()
            .SelectMany(a => a.GetTypes())
            .Where(p => interfaceType.IsAssignableFrom(p) amp;amp; p.IsClass)
            .ToArray();
        foreach (Type type in types)
        {
            // Create a new instance of all found types
            PluginLists.All.Add((IPlugin)Activator.CreateInstance(type));
            Console.WriteLine("Plugin loaded: {0}", type.ToString());
        }
        Console.WriteLine("Plugins loaded: {0}", PluginLists.All.Count);
    }
  

И каждая библиотека dll реализует метод, который запускает форму

 public void Plugin_Start(DockPanel _dockPanel)
{
    //
    var miscForm = new frmMiscellaneousTest();
    miscForm.Show(_dockPanel, DockState.DockRight);
}
  

Спасибо за любую предоставленную помощь, мы очень ценим.

Комментарии:

1. вызов недействительного метода

2. @vivek: Я пробовал это, извиняюсь, что не упомянул об этом в своей статье. Это не меняется, : (

3. Вы пытались обновить элемент управления или всю форму после изменения значения. Form1.Refresh() или Label1.Refresh()

4. Да, я все это пробовал. Вероятно, мне не хватает чего-то простого:/ Код, который у меня есть в методе в Form1, теперь выглядит так: ` if (cmd == «TEST») { label1. Text = «Теперь это должно измениться»; bool test = label1. Требуется вызов; label1. Объявить недействительным (true); label1.Update(); label1.Refresh(); это. Сделать недействительным (true); это. Update(); это. Refresh(); } ` Кажется, ничего не происходит, 🙁

5. Вы используете простые Winforms или какой-либо фреймворк? Я знаю, что элементы управления DevExpress всегда имеют такие свойства, как AllowEdit или sth. Если это значение false, текст не изменится.

Ответ №1:

Я использовал приведенный ниже код (закомментированный сейчас), чтобы показать форму, но я совершенно забыл, что я уже был в форме и мне не нужно было создавать ее снова, : (

 public void Plugin_Start()
{
    //
    this.Show();
    //var MiscForm = new frmMiscellaneousTest();
    //MiscForm.Show();
}