Существуют две проблемы с вашим текущим кодом:
- Вам не нужно создавать новый экземпляр формы каждый раз, когда вам нужно установить некоторые из его свойств: сохранить ссылку на эту форму ииспользуйте эту ссылку для вызова открытых свойств или методов формы.
- Вы пытаетесь получить прямой доступ к свойствам дочернего элемента управления другой формы.Событие, хотя вы можете определить дочерний элемент управления
public
, вы не должны, и в этом нет необходимости.Форма - это класс, аналогичный любому другому в этом аспекте: создайте в форме открытый метод, который предоставляет средства для изменения частного свойства, не подвергая свойство Control непосредственному доступу напрямую.
Это просто, безопаснее и более portable : если требуется изменить элемент управления (имя изменено, тип элемента управления изменен и т. д.), вам не нужно отправляться на охоту, чтобы выяснить, где использовалось старое имя / свойствадругие классы.
Открытый метод будет таким же, и он будет единственно ответственным за ссылку на текущие имена, свойства затронутого элемента управления.Единственное место, где код, в конце концов, необходимо изменить.Вы также можете использовать открытое событие или реализовать INotifyPropertyChanged , чтобы уведомить подписчиков об изменении некоторых свойств.
Здесь я создаю ссылку на Monitor4
в Monitor3
Форма:
Monitor4 mo4 = null;
Эта ссылка будет использоваться для вызова открытого метода (UpdatePictureBox
) Monitor4
.
Monitor3
Форма:
(I 'm используя событие TextChanged
TextBox, чтобы выбрать изображение для показа в Monitor4
PictureBox. Конечно, это может быть событие Validate
или что-либо еще, что соответствует вашему дизайну)
public partial class Monitor3 : Form
{
Monitor4 mo4 = null;
private void Monitor3_Load(object sender, EventArgs e)
{
mo4 = new Monitor4();
//Show Monitor4 on the right side of this Form
mo4.Location = new Point(this.Right + 10, this.Top);
mo4.Show(this);
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
string NewText = textBox1.Text;
switch (NewText)
{
case "[Some text 1]":
mo4.UpdatePictureBox(@"[Images1 Path]");
break;
case "QUEBEC - ALPHA - TANGO - ALPHA - ROMEO - ":
mo4.UpdatePictureBox(@"[Images2 Path]");
break;
case "[Sme text 3]":
mo4.UpdatePictureBox(@"[Images3 Path]");
break;
}
}
}
Monitor4
Форма:
public partial class Monitor4 : Form
{
public void UpdatePictureBox(string BitmapImage)
{
if (File.Exists(BitmpImage))
{
if (this.pictureBox1.Image != null)
this.pictureBox1.Image.Dispose();
this.pictureBox1.Image = (Image)Image.FromFile(BitmapImage, true).Clone();
}
}
}
Пример выборки:
![Access a Form's Control from another class](https://i.stack.imgur.com/8q3lO.gif)