我有一个Windows窗体应用程序,我要求允许用户在窗体上添加尽可能多的电子邮件ID
我希望能够在单击按钮时为电子邮件ID字段添加文本框控件。文本框应动态添加,并且可以在表单上添加N个文本框。
同时,在任何给定时间点,用户都应能够删除添加的文本框。单击“保存”按钮后,所有“ n”封电子邮件都需要存储在数据库中。
任何人都可以建议如何在Windows窗体应用程序中进行操作吗?
答案 0 :(得分:0)
您可能应该创建一个自定义用户控件来保存您的电子邮件地址并删除按钮。这样,您可以按“删除”按钮删除该电子邮件地址/控件。
然后,您将希望您的主窗体具有一个按钮来添加电子邮件地址(自定义控件的实例),然后是一个FlowLayoutPanel来保存您的客户控件。
您的自定义控制代码应类似于:
public class EmailAddressControl : UserControl
{
public string EmailAddress
{
get
{
return(tbEmailTextBox.Text);
}
set
{
tbEmailTextBox.Text = value;
}
}
public EmailAddressControl()
{
InitializeComponent();
}
public event EventHandler<EventArgs> RemoveEmailAddress;
public void btnRemoveEmailAddress_Click(object sender, EventArgs e)
{
RemoveEmailAddress?.Invoke(this, EventArgs.Empty);
}
}
我们在UserControl上有两个子控件,tbEmailTextBox
是一个文本框,btnRemoveEmailAddress
是一个按钮。 tbEmailTextBox
将保留您用户输入的电子邮件地址。您可以从控件外部通过EmailAddress属性访问它。 btnRemoveEmailAddress
将触发RemoveEmailAddress
事件,该事件将通知其订阅者应将其关闭。
就像我之前说过的那样,您的主表单应该有一个FlowLayoutPanel
和几个按钮。我们将调用btnAddEmail
的按钮将电子邮件用户控件添加到屏幕和面板中,我们将调用flpEmailAddresses
,第二个按钮将调用btnSaveEmails
,将您的电子邮件保存到数据库(按钮不应是流布局面板的子级-主要用于外观)。
您的主要代码形式如下:
public class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
public void btnAddEmail_Click(object sender, EventArgs e)
{
EmailAddressControl email = new EmailAddressControl();
email.RemoveEmailAddress += RemoveEmailAddress;
flpEmailAddresses.Controls.Add(email);
}
public void RemoveEmailAddress(object sender, EventArgs e)
{
EmailAddressControl email = sender as EmailAddressControl;
email.RemoveEmailAddress -= RemoveEmailAddress;
flpEmailAddresses.Controls.Remove(email);
email.Dispose();
email = null;
}
public void btnSaveEmails_Click(object sender, EventArgs e)
{
foreach(EmailAddressControl email in flpEmailAddresses.OfType<EmailAddressControl>())
{
databaseinstance.SaveEmail(email.EmailAddress);
}
}
}
在btnAddEmail_Click
中,我们将创建EmailAddressControl
的新实例并订阅RemoveEmailAddress
事件,以便主表单知道何时删除它。然后,将其添加到flpEMailAddresses
面板中。
当用户按下btnRemoveEmailAddress
时,它将在RemoveEmailAddress
事件处理程序中提供RemoveEmailAddress
事件,该事件由主表单捕获。在此处理程序中,我们将发件人对象从RemoveEmailAddress事件取消订阅到EmailAddressControl
(以避免内存泄漏并允许垃圾回收控件),然后从flpEmailAddresses
面板中删除该控件,最后处置EmailAddressControl
。
如果用户单击btnSaveEmails
按钮,则应用程序将循环访问flpEmailAddresses
的子级EmailAddressControls,并从每个电子邮件地址中检索该EmailAddress并将其发送到databaseinstance.SaveEmail
。我会留给您自己为自己实现databaseinstance.SaveEmail(string emailaddress)
。