Как я могу что-то изменить в Form1 из DialogBox? - PullRequest
3 голосов
/ 24 мая 2011

Допустим, у меня есть две формы (Форма 1 и Форма 2).

  • У Form1 есть PictureBox
  • У Form2 у меня есть OpenFileDialog

Form1 - основная форма, поэтому при запуске проекта я вижу Form1.

Как я могу изменить изображение в PictureBox в Form1 с Form2?

Ответы [ 5 ]

2 голосов
/ 24 мая 2011

В файле Program.cs вы можете установить любое значение, либо FormOptions для экземпляра формы.

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        var frm = new Form1();
        // Add the code to set the picturebox image url
        Application.Run(frm);
    }

Кроме того, вы можете добавить конструктор в Form1 и передать параметр через конструктор.

2 голосов
/ 24 мая 2011

Передайте одну форму в качестве параметра конструктору второй формы или добавьте метод, который передал ссылку.После того, как вы получите ссылку на свою форму, вы можете делать с ней все, что захотите.

Вопрос о том, делиться ли ящиком с картинками в качестве общедоступного участника, остается за вами.Однако я бы предложил сделать публичный метод SetImage() в первой форме.Вторая форма будет вызывать form1.SetImage().

[Обновить]

Подождите, почему вам нужно установить изображение из OpenFileDialog, вам просто нужно получить fileName из диалога,а затем откройте файл и загрузите в форму.

Примерно так:

private void button1_Click(object sender, EventArgs e)
{
    using (var dialog = new OpenFileDialog())
    {
        var result = dialog.ShowDialog();
        if (result != DialogResult.OK)
            return;
        pictureBox1.Image = Image.FromFile(dialog.FileName);
    }
}

Это код внутри формы 1.

[Обновление]

Вот основная идея, как получить доступ к одной форме из другой.

public class MyForm1 : Form
{
    public MyForm1()
    {
        InitializeComponent();
    }

    public void SetImage(Image image)
    {
        pictureBox1.Image = image;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var form2 = new Form2(this);
        form2.Show();
    }
}

public class MyForm2 : Form
{
    private MyForm1 form1;

    public MyForm2()
    {
        InitializeComponent();
    }

    public MyForm2(MyForm1 form1)
    {
        this.form1 = form1;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        form1.SetImage(yourImage);
    }
}
2 голосов
/ 24 мая 2011

Как передать значение из дочернего элемента в родительскую форму?

По сути, представьте значение, которое возвращается в диалоге открытия файла с некоторым свойством, и разрешите родительскому элементуФорма захватить его.

1 голос
/ 24 мая 2011

Вы можете очень просто сделать это. Сначала измените свой код (в Form1), который показывает, что Form2 выглядит следующим образом:

<variable-of-type-Form2>.ShowDialog(this);

или если вы не хотите, чтобы form2 была модальной

<variable-of-type-Form2>.Show(this);

Далее, когда вы получили путь к изображению, вы можете получить доступ к pictureBox, как это

((PictureBox)this.Owner.Controls["pictureBox1"]).Image=Image.FromFile(<filename>);

Предположим, что в Form1 у вас есть PictureBox с именем "pictureBox1"

1 голос
/ 24 мая 2011

В идеале вы хотите структурировать свой код в виде ModelViewController .Затем в вашей модели просто есть ссылка на изображение в графическом окне.При взаимодействии с OpenFileDialog в Form2 вы должны вызывать интерфейсы адаптера вашей модели, подключенные к представлениям (Form1 и Form2), чтобы изменить изображение, содержащееся в модели.Короче говоря, вам нужен обратный вызов от представления к модели.Если вы не хотите переделывать код в MVC, просто создайте общий объект, содержащий ссылку на изображение, которое Form1 и Form2 получают в своих конструкторах, чтобы они оба могли его изменить.

...