Как я могу перенести информацию в другую форму, не используя статические формы? - PullRequest
0 голосов
/ 25 июня 2010

У меня есть форма Windows, которая генерируется с использованием кода (включая кнопки и что нет). На нем, помимо прочего, есть текстовое поле и кнопка. При нажатии на кнопку открывается новая форма Windows, которая напоминает список контактов Outlook. Это в основном представление сетки данных с несколькими вариантами фильтрации. Идея состоит в том, что пользователь выбирает строку в этой домашней книге контактов и нажимает кнопку. После нажатия этой кнопки (вторая) форма должна закрыться, а выбранный пользователем адрес электронной почты должен отображаться в текстовом поле формы first .

Я не могу использовать статические формы для этой цели, так есть ли способ сообщить первой форме, что пользователь выбрал что-то во второй фирме? Вы можете сделать это с событиями, или есть другой способ? Имейте ввиду, что я почти ничего не знаю о делегатах и ​​формах.

Пожалуйста, сообщите.


Редактировать 1 = РЕШЕНО

Я могу вернуть адрес электронной почты из второй формы в первую форму, но это подводит меня к другому вопросу. Я генерирую элементы управления, и в этом процессе я также генерирую обработчик событий MouseClick, в который помещена предыдущая процедура выбора контакта.

Но как мне после возвращения адреса электронной почты в обработчике событий MouseClick вставить эту информацию в сгенерированное текстовое поле? Код для иллюстрации:

        btn.MouseClick += new MouseEventHandler(btn_MouseClick);

Эта строка находится где-то в методе GenerateControls().

    void btnContacts_MouseClick(object sender, MouseEventArgs e)
    {
        using (frmContactList f = new frmContactList())
        {
            if (f.ShowDialog(fPrompt) == DialogResult.Cancel)
            {                    
                var address = f.ContactItem;
                MessageBox.Show(address.Email1Address.ToString());
            }                
        }
    }

Это появляется отдельно в классе. Так как же поместить адрес электронной почты в текстовое поле, которое я ранее создал?

Ответы [ 4 ]

2 голосов
/ 25 июня 2010

Формы в .Net - это обычные классы, которые наследуются от Form класса.

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

Вы должны показать всплывающее окно, позвонив ShowDialog.
Это блокирующий вызов, который покажет вторую форму в виде модального диалога.
Вызов завершается только после закрытия второй формы, поэтому следующая строка кода будет выполняться после того, как пользователь закроет всплывающее окно.

Затем вы можете проверить свойство во второй форме, чтобы узнать, что выбрал пользователь.

Например: (в первом классе)

using(ContactSelector popup = new ContactSelector(...)) {
    if (popup.ShowDialog(this) == DialogResult.Cancel)
        return;
    var selectedAddress = popup.SelectedAddress;
    //Do something
}
0 голосов
/ 25 июня 2010

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

0 голосов
/ 25 июня 2010

Вы должны сохранить ссылку на сгенерированный TextBox в переменной (закрытое поле в вашем классе) и использовать ее вместо поиска в массиве Controls. Таким образом, ваш код будет работать, даже если вы когда-нибудь в будущем измените его расположение в массиве, и вы получите сообщение компилятора, если вы удалите это поле, но забудете удалить код, который его использовал.

0 голосов
/ 25 июня 2010

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

    void btnContacts_MouseClick(object sender, MouseEventArgs e)
    {            
        using (frmContactList f = new frmContactList())
        {
            if (f.ShowDialog(fPrompt) == DialogResult.Cancel)
            {
                var contact = f.ContactItem;
                TextBox tbx = ((Button)sender).Parent.Controls[0] as TextBox;
                tbx.Text = contact.Email1Address;
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...