Winforms Windows窗体添加动态删除用户控件

Winforms Windows窗体添加动态删除用户控件,winforms,dynamic,Winforms,Dynamic,我有一个windows窗体应用程序,我要求允许用户在窗体上添加尽可能多的电子邮件ID 我希望能够添加一个功能,为电子邮件ID字段的文本框控制按钮点击。文本框应该动态添加,并且可以在表单上添加N个文本框 同时在任何给定点用户都应该能够删除添加的文本框。单击“保存”按钮后,所有“n”封电子邮件都需要存储在数据库中 是否有人可以建议如何在Windows窗体应用程序中执行此操作?您可能应该创建一个自定义用户控件来保存您的电子邮件地址并删除按钮。这样,您可以按“删除”按钮删除该电子邮件地址/控件 然后,您

我有一个windows窗体应用程序,我要求允许用户在窗体上添加尽可能多的电子邮件ID

我希望能够添加一个功能,为电子邮件ID字段的文本框控制按钮点击。文本框应该动态添加,并且可以在表单上添加N个文本框

同时在任何给定点用户都应该能够删除添加的文本框。单击“保存”按钮后,所有“n”封电子邮件都需要存储在数据库中


是否有人可以建议如何在Windows窗体应用程序中执行此操作?

您可能应该创建一个自定义用户控件来保存您的电子邮件地址并删除按钮。这样,您可以按“删除”按钮删除该电子邮件地址/控件

然后,您希望主窗体有一个按钮来添加电子邮件地址(自定义控件的一个实例),然后有一个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);
    }
}
btnAddEmail\u单击
中,我们正在创建您的
EmailAddressControl
的新实例,并订阅
removeMailAddress
事件,以便主窗体知道何时删除它。然后,我们将其添加到
flpEMailAddresses
面板中

当用户按下
btnRemoveEmailAddress
时,它会在
RemoveEmailAddress
事件处理程序中触发由主窗体捕获的
RemoveEmailAddress
事件。在此处理程序中,我们将发送者对象强制转换为
EmailAddressControl
取消订阅RemoveEmailAddress事件(以避免内存泄漏并允许对控件进行垃圾收集),然后从
flpEmailAddresses
面板中移除控件,最后处置
EmailAddressControl

如果用户单击
btnSaveEmails
按钮,则应用程序将在属于
flpEmailAddresses
的子项的EmailAddress控件上循环,从每个控件中检索EmailAddress,并将其发送到
databaseinstance.SaveEmail
。我将让您自己实现
databaseinstance.SaveEmail(stringemailaddress)

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