В прошлом у меня была похожая проблема, первое, что пришло мне в голову, было использовать System.Reflection
, но это невозможно, потому что вы не можете определить во время выполнения, какой экземпляр был создан.
Я не нашел никакого «волшебного» решения для этой проблемы, но самым простым и безопасным решением, которое я нашел, было расширение базового класса Form
(до моего пользовательского SuperForm
) и использование этого базового класса для координации и обновления. статический список всех экземпляров этого базового класса (путем переопределения методов OnLoad()
и OnClosed()
).
Очевидно, что все заявки должны наследоваться от SuperForm
.
Кроме того, я обнаружил, что в обширном приложении winforms создание всех форм для наследования класса, который вы сами расширяете, является хорошей практикой, поскольку оно дает вам гораздо больший контроль над приложением и может упростить вашу жизнь в будущем.
Вот пример архитектуры:
Класс SuperForm:
public class SuperForm : Form
{
private bool _isFormActive = false;
public bool isFormActive
{
get
{
return this._isFormActive;
}
set
{
this._isFormActive = value;
}
}
protected override void OnLoad(EventArgs e)
{
this.isFormActive = true;
AppForms.Add(this);
base.OnLoad(e);
}
protected override void OnClosed(EventArgs e)
{
this.isFormActive = false;
AppForms.Remove(this);
base.OnClosed(e);
}
}
Статический класс со статическим списком для обработки экземпляров форм приложения:
public static class AppForms
{
private static List<SuperForm> _AppFormsList;
public static List<SuperForm> AppFormsList
{
get
{
if (_AppFormsList == null)
{
_AppFormsList = new List<SuperForm>();
}
return _AppFormsList;
}
set
{
_AppFormsList = value;
}
}
public static void Add(SuperForm instance)
{
AppFormsList.Add(instance);
}
public static void Remove(SuperForm instance)
{
AppFormsList.Remove(instance);
}
}
Реализация:
public partial class Form1 : SuperForm
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
// you dont have to use polymorphism...
SuperForm f = new Form2();
f.Show();
}
private void button2_Click(object sender, EventArgs e)
{
// you dont have to use polymorphism...
SuperForm f = new Form3();
f.Show();
}
private void button3_Click(object sender, EventArgs e)
{
// show all the forms that are active
foreach (var frm in AppForms.AppFormsList)
{
MessageBox.Show(((SuperForm)frm).isFormActive.ToString());
}
}
}