Войти

Показать полную графическую версию : [решено] доступ к элементам дочерних форм в MDI


SeRgikON
03-12-2011, 19:29
есть две формы, одна родительская (MainForm), другая дочерняя (ChildForm) с элементом PictureBox (по ней создаются другие дочерние формы), как получить доступ к PictureBox'у активной дочерней формы (т.е допустим загрузить в него картинку)
например:

public class MainForm: Form
{

private void создание_нового_окна(object sender, EventArgs e)
{
if (ofd.ShowDialog() == DialogResult.OK) //где ofd - OpenFileDialog
{
ChildForm cf = new ChildForm ();
cf.MdiParent = this;
cf.PictureBox.Image = Image.FromFile(ofd.FileName);
cf.Show();
}
}
}
так будет создаваться новое окно с выбранной картинкой, но как потом перезаписать эту картинку (допустим применив к ней какой-нибудь фильтр).
если вынести создание объекта класса дочерней формы (ChildForm cf = new ChildForm ()) из метода и объявить его в классе, то к PictureBox'у можно будет обратиться и перезаписать картинку, но соответственно MDI уже не будет, т.к просто будет "переоткрываться" одна и та же форма...я походу сильно туплю, подскажите как исправить)

Delirium
05-12-2011, 01:16
Как вариант - перебирать циклом Foreach коллекцию всех дочерних окон MDI приложения и в нужной форме производить изменения.

Delirium
05-12-2011, 02:03
Вот мое решение. Mdi форма, одна кнопка открывает одну форму, другая - другую. В первой форме только PictureBox (метод доступа к объекту - Public), на второй кнопка, по ее нажатию в первой форме меняется картинка на другую.
Код кнопки из второй формы:
private void button1_Click(object sender, EventArgs e)
{
foreach (Form chform in this.MdiParent.MdiChildren) //пробегаемся по дочерним окнам основного окна
{
if (chform.Name == "ChildForm") //если нашли нужную нам форму, то
{
((PictureBox)chform.Controls["PictureBox1"]).Image = Image.FromFile(@"D:\picture2.png");
//Находим наш контрол на первой форме и меняем картинку.
}
}
}

А вообще есть неплохие мануалы. Почитай вот это:
http://www.codeproject.com/KB/cs/mdiformstutorial.aspx
http://stackoverflow.com/questions/7142230/close-mdi-child-form-from-another-form

SeRgikON
05-12-2011, 19:37
спасибо, разобрался. в итоге для работы с элементом активной дочерней формы нужна одна строчка:
((Название_класса_контрола)ActiveMdiChild.Controls["Имя_контрола_на_форме"])
например из вашего цикла:
((PictureBox)ActiveMdiChild.Controls["PictureBox1"]).Image = Image.FromFile(@"D:\picture2.png");
в результате выполнения в PictureBox1, расположенный на активной дочерней форме загрузится изображение picture2. Аналогично можно работать с другими контролами и их методами.

Delirium
06-12-2011, 04:36
SeRgikON, вот видишь как чудесно, и проблему решил и мне подсказал более простой вариант :)




© OSzone.net 2001-2012