我有一个使用代码生成的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());
}
}
}
在课堂上单独出现。那么如何将电子邮件地址放入我之前生成的文本框中呢?
答案 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它,在某处复制相应的数据,处理表单,最后返回相应的数据。如果使用该方法,请使第二个表单的构造函数受保护,因为表单只应使用共享函数创建。