Значение из Form2 не обновляется в Form2 - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть 2 формы в настольном приложении C #. Форма 1 и Форма 2.

Form1 содержит открытый метод, который добавляет элемент в элемент управления ListBox следующим образом:

public void AddToList(string item)
{
    listBox.Items.Add(item);
}

Когда я вызываю этот метод непосредственно при нажатии какой-либо кнопки, он работает нормально. Но когда я вызываю этот метод из Form2, он ничего не добавляет в элемент управления ListBox в Form1. Код в форме 2, как показано ниже:

Form1 frm = new Form1();
frm.AddToList("something");

Когда я бегу, ничего не происходит. Без ошибок ничего. Он просто не добавляет ни одного элемента в ListBox.

Что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 03 апреля 2012

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

Наивный подход - иметь параметр в конструкторе Form2, который принимает экземпляр Form1 и сохраняет его в качестве переменной экземпляра для использования в этом обработчике событий.

Мне не очень нравится такой подход с точки зрения дизайна.

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

public event EventHandler ButtonClick
{
    add
    {
        button1.Click += value;
    }
    remove
    {
        button1.Click += value;
    }
}

Тогда у вас будет свойство, которое выглядит примерно так:

public string SomeValueForm1NeedsOnButtonClick
{
    get
    {
        return texbox1.Text;
    }
}

Тогда в Form1 у вас будет что-то вроде:

Form2 otherForm = new Form2();
otherForm.ButtonClick += (sender, args) =>
{
    listbox1.Items.Add(otherForm.SomeValueForm1NeedsOnButtonClick);
};

Этот подход гарантирует, что каждая форма знает как можно меньше о каждой другой форме. Это уменьшает сцепление между двумя классами и делает более понятными для будущих пользователей / читателей форм, что именно происходит между ними.

0 голосов
/ 03 апреля 2012

Хм

Если бы вы следовали этому коду с помощью frm.Show (), вы бы его увидели. Это не то, чего ты хочешь.

Ваш подход к проблеме немного наивен.

Вы можете добавить свойство в form2 и установить его для экземпляра Form1, который вы хотите использовать. (PS form1 и form2 не помогают, дают им собственные имена. MainForm и DetailForm или что-то подобное).

Проблема с вышесказанным в том, что вы реализовали ужасную зависимость.

Множество способов это сделать, можно было бы использовать отдельный класс для хранения списка (интерфейс и класс были бы еще лучше). Затем добавьте свойство в Form1 и Form2 своего типа или класса.

Form2 может затем добавить вещи в список. Это поднимает список измененных событий. Form1 подключается к обработчику событий, а затем обновляет список, который он использует для отображения действий.

Если у вас есть инфраструктура в polace, вы можете делать с ней все что угодно, в то время как метод, который вы используете, состоит из большого количества кода и требует небольшого вознаграждения.

0 голосов
/ 03 апреля 2012

Form1 frm = new Form1();

эта строка создает новый экземпляр Form2 ... не тот экземпляр, который уже отображается на экране. поэтому вы добавляете в список этого вторичного экземпляра, который никогда не отображается на экране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...