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

时间:2018-07-31 21:04:28

标签: winforms dynamic

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

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

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

任何人都可以建议如何在Windows窗体应用程序中进行操作吗?

1 个答案:

答案 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)