如何在不使用静态表单的情况下将信息传输到其他表单?

时间:2010-06-25 13:39:53

标签: c# forms dialog

我有一个使用代码生成的Windows表单(包括按钮和不包含的内容)。除此之外,还有一个文本框和一个按钮。单击该按钮将打开一个类似于Outlook联系人列表的新Windows窗体。它基本上是一个数据网格视图,有一些过滤选项。这个想法是用户在这个自制的联系簿中选择一行并点击一个按钮。点击该按钮后,(第二个)表单应该关闭,用户选择的电子邮件地址应该显示在第一个表单的文本框中。

我不能为此目的使用静态表单,所以有没有办法让第一个表单知道用户在第二个公司选择了什么?你能用事件做到这一点,还是有另一种方式?请注意,我对代表和表格几乎一无所知。

请告知。


编辑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 个答案:

答案 0 :(得分:2)

.Net中的表单是继承自Form类的普通类。

您应该将属性添加到获取所选电子邮件地址的第二个(弹出式)表单。

您应该通过致电ShowDialog来显示弹出窗口 这是一个阻塞调用,它将第二种形式显示为模态对话框 调用仅在第二个表单关闭后结束,因此下一行代码将在用户关闭弹出窗口后运行。

然后,您可以检查第二个表单中的属性,以找出用户选择的内容。

例如:(在第一种形式中)

using(ContactSelector popup = new ContactSelector(...)) {
    if (popup.ShowDialog(this) == DialogResult.Cancel)
        return;
    var selectedAddress = popup.SelectedAddress;
    //Do something
}

答案 1 :(得分:0)

在回复我的第一次编辑时,这是我解决它的方式。如果有人知道如何让它更优雅,请告诉我。

    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;
            }
        }
    }

答案 2 :(得分:0)

您应该在变量(类中的私有字段)中保留对生成的TextBox的引用,并使用它而不是在Controls数组中查找它。这样,即使您将来某个时间更改它在数组中的位置,您的代码仍然可以工作,如果您删除了该字段,但是忘记删除使用它的代码,您将获得编译器消息。

答案 3 :(得分:0)

如果第二个表单是模态的,我建议不要让第一个表单创建第二个表单的实例并在其上使用ShowModal,你应该在第二个表单的类中有一个共享/静态函数,它将创建一个第二种形式的实例,ShowModal它,在某处复制相应的数据,处理表单,最后返回相应的数据。如果使用该方法,请使第二个表单的构造函数受保护,因为表单只应使用共享函数创建。