#c# #winforms #dll #visual-studio-2015 #label
#c# #winforms #dll #visual-studio-2015 #метка
Вопрос:
Я загрузил форму Windows из .dll, и она отображается правильно, и я могу выполнять методы, созданные в этой .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();
}