我如何删除一个实例的DateTimePicker在WinForms

本文关键字:WinForms 实例 DateTimePicker 一个 何删除 删除 | 更新日期: 2023-09-27 18:06:35

我正在根据ComboBox中的值创建DateTimePicker对象,但这只是显示当它是选择,然后我需要删除这个DateTimePicker

private void cbxBaseDados_SelectedIndexChanged(object sender, EventArgs e) {
        var dtInical = new DateTimePicker() {
             Name = "dateTimePickerLogInicial",
             Size = new Size(135, 68),
             Margin = new Padding(3, 9, 3, 3)
        };
        var dtFinal = new DateTimePicker() {
            Name = "dateTimePickerLogFinal",
            Size = new Size(135, 68),
            Margin = new Padding(3, 9, 3, 3)
        };
        if (cbxBaseDados.Text.Equals("Value")) {
            lbPeriodo.Hide();
            periodoTimePicker1.Hide();
            periodoTimePicker2.Hide();
            txtPeriodo1.Hide();
            txtPeriodo2.Hide();
            tableLayoutPanel2.ColumnCount = 13;
            tableLayoutPanel2.Controls.Add(dtInical, 6, 0);
            tableLayoutPanel2.Controls.Add(lbAPeriodo, 7, 0);
            tableLayoutPanel2.Controls.Add(dtFinal, 8, 0);
        } else {
            dtInical.Hide();
            dtFinal.Hide();
            tableLayoutPanel2.Controls.Remove(dtInical);
            tableLayoutPanel2.Controls.Remove(dtFinal);
         }
}

Hide()Remove()之后,dtIncialdtFinal仍然存在。

我该如何移除它?

我如何删除一个实例的DateTimePicker在WinForms

尝试在表单中创建字段,分配名称" dateTimePickerLogInicial "answers" dateTimePickerLogFinal ",而不是创建代码本身。在表单中创建各自的字段之后,调用Hide()方法来隐藏它们。

Before Check Form是否已添加此控件

      if(tableLayoutPanel2.Controls.ContainsKey("dateTimePickerLogInicial"))
         tableLayoutPanel2.Controls.RemoveByKey("dateTimePickerLogInicial");
       if(tableLayoutPanel2.Controls.ContainsKey("dateTimePickerLogFinal"))
           tableLayoutPanel2.Controls.RemoveByKey("dateTimePickerLogFinal");
            //Your Code Like This
            if (cbxBaseDados.Text.Equals("Value"))
            {
                var dtInical = new DateTimePicker()
                {
                    Name = "dateTimePickerLogInicial",
                    Size = new Size(135, 68),
                    Margin = new Padding(3, 9, 3, 3)
                };
                var dtFinal = new DateTimePicker()
                {
                    Name = "dateTimePickerLogFinal",
                    Size = new Size(135, 68),
                    Margin = new Padding(3, 9, 3, 3)
                };
                lbPeriodo.Hide();
                periodoTimePicker1.Hide();
                periodoTimePicker2.Hide();
                txtPeriodo1.Hide();
                txtPeriodo2.Hide();
                tableLayoutPanel2.ColumnCount = 13;
                tableLayoutPanel2.Controls.Add(dtInical, 6, 0);
                tableLayoutPanel2.Controls.Add(lbAPeriodo, 7, 0);
                tableLayoutPanel2.Controls.Add(dtFinal, 8, 0);
            }

我不建议在后面的代码中创建和删除控件。最好像正常一样在表单上创建控件,然后在程序开始时简单地调用Hide()。然后,当你需要它的时候,你只需调用Show(),直到你不再需要它。

您的特定代码示例不能隐藏或删除控件的原因是因为您正在使用的引用仅在该方法的作用域中。

每次调用方法时,您的代码都会创建一组新的控件,一旦离开作用域,只会丢失对这些控件的引用。这意味着您没有删除在前一次调用中创建的控件,而是删除了刚刚创建的新控件。


要修复当前的代码,尽管我建议您重新考虑您的方法,但请执行以下操作:

DateTimePicker dtInical;
DateTimePicker dtFinal;
private void cbxBaseDados_SelectedIndexChanged(object sender, EventArgs e) {
    if (cbxBaseDados.Text.Equals("Value")) {
        if (dtInical == null) {
            dtInical = new DateTimePicker() {
                 Name = "dateTimePickerLogInicial",
                 Size = new Size(135, 68),
                 Margin = new Padding(3, 9, 3, 3)
            };
            tableLayoutPanel2.Controls.Add(dtInical, 6, 0);
        }
        if (dtFinal == null) {
            dtFinal = new DateTimePicker() {
                Name = "dateTimePickerLogFinal",
                Size = new Size(135, 68),
                Margin = new Padding(3, 9, 3, 3)
            };
            tableLayoutPanel2.Controls.Add(dtFinal, 8, 0);
        }
        lbPeriodo.Hide();
        periodoTimePicker1.Hide();
        periodoTimePicker2.Hide();
        txtPeriodo1.Hide();
        txtPeriodo2.Hide();
        tableLayoutPanel2.ColumnCount = 13;
        tableLayoutPanel2.Controls.Add(lbAPeriodo, 7, 0);
    } else {
        dtInical.Dispose();
        dtFinal.Dispose();
        dtInical = null;
        dtFinal = null;
    }
}

但是,正如我说过的,我建议您像正常一样在表单上创建控件,并简单地这样做:
private void cbxBaseDados_SelectedIndexChanged(object sender, EventArgs e) {
    if (cbxBaseDados.Text.Equals("Value")) {
        dtInical.Show();
        dtFinal.Show();
        lbPeriodo.Hide();
        periodoTimePicker1.Hide();
        periodoTimePicker2.Hide();
        txtPeriodo1.Hide();
        txtPeriodo2.Hide();
        tableLayoutPanel2.ColumnCount = 13;
        tableLayoutPanel2.Controls.Add(lbAPeriodo, 7, 0);
    } else {
        dtInical.Hide();
        dtFinal.Hide();
    }
}

如果你想隐藏它,你应该试试这个。

dtFinal.Visible = False;
dtInical.Visible = False;