单击无按钮时清除标签页上的所有数据

时间:2014-03-17 19:37:47

标签: c# tabpage

在我的应用程序中我在tabControls页面(页面:tabPage2)上向数据库提交数据,我希望在点击提交按钮时首先将数据保存到数据库(即时实现这一点),一个问题会问什么都会完成?如果用户点击no按钮,tabpage2上的所有字段都将重置。所以我写了一个类似下面的脚本,但它没有清除字段。

        if (dr == DialogResult.Yes)
        {
            for (int i = 0; i < this.tabControl1.Controls.Count; i++)
            {

                if (this.tabControl1.SelectedTab == tabPage2)
                {
                    if (tabPage2.Controls[i] is TextBox)
                    {
                        tabPage2.Controls[i].Text = "";
                    }

                    if (tabPage2.Controls[i] is ComboBox)
                    {
                        tabPage2.Controls[i].Text = "";
                    }

                    if (tabPage2.Controls[i] is PictureBox)
                    {
                        tabPage2.Controls[i].Text = "";
                    }

                    if (tabPage2.Controls[i] is RadioButton)
                    {
                        tabPage2.Controls[i].Text = "";
                    }

                }


            }

        }

2 个答案:

答案 0 :(得分:2)

如果您要在要清除的特定标签页中控制页面布局的类,则最好在该类中创建一个公共或内部方法(例如Clear()),该方法可以访问每个类成员控制并直接清除它们。这是最简单的方法,通常应该适用。

如果需要它来处理结构未知的页面,您可能需要一种方法:

private void ClearControls(Control parentControl)
{
    foreach (Control ctrl in parentControl.Controls)
    {
        TextBox ctrlText;
        ComboBox ctrlCombo;
        PictureBox ctrlPicture;
        RadioButton ctrlRadio;

        // Pay careful attention to the parentheses...
        if ((ctrlText = ctrl as TextBox) != null)
        {
            ctrlText.Text = string.Empty;
        }
        else if ((ctrlCombo = ctrl as ComboBox) != null)
        {
            ctrlCombo.SelectedIndex = -1;
        }
        else if ((ctrlPicture = ctrl as PictureBox) != null)
        {
            // Logic to clear a PictureBox called ctrlPicture
        }
        else if ((ctrlRadio = ctrl as RadioBox) != null)
        {
            // Logic to clear a RadioButton called ctrlRadio
        }
        else if (ctrl.Controls.Count > 0)
        {
            ClearControls(ctrl); // Recursively clear contained controls.
        }
    }
}

通过调用从原始处理程序启动它:

if (dr == DialogResult.Yes)
    ClearControls(this.tabControl1);

答案 1 :(得分:0)

您正在关注TabControl个子控件的集合,而不是实际的TabPage

将代码改为:

if (dr == DialogResult.Yes && this.tabControl1.SelectedTab == tabPage2)
{
    foreach (var ctrl in tabPage2.Controls)
    {
        if (ctrl is TextBox || ctrl is ComboBox || ctrl is PictureBox || ctrl is RadioButton)
        {
            ctrl.Text = "";
        }
    }
}

我应该说,除了将Text属性设置为“”以外,TextBox以外的控件对我来说是错误的。正如您所知,这对于组合,图像和单选按钮不起作用。

此外,如果您将控件嵌套到面板等中,则不会清除它们。容器有自己的嵌套控件集合,而控件又可以是容器,依此类推。

恕我直言你可以逐一明确地重置表单控件,而不是试图在表单上动态找到它们。通过这种方式,您可以在设计时自由移动控件,而无需担心破坏重置逻辑。

其他建议:您还可以在设计时将控件附加到您自己的IExtenderProvider组件的实例,该组件将根据其类型适当地重置控件。