C# 在完成特定任务后,清除每件事

C# 在完成特定任务后,清除每件事,c#,.net,C#,.net,我正在开发一个软件,在完成一项特定任务后,我想清除每一件事情,比如清除所有字段、列表视图等,我必须写下许多要清除的事情,比如我的新按钮的代码是: private void btnNew_Click(object sender, EventArgs e) { txtProductCode1.ReadOnly = false; txtInvoiceNo.ReadOnly = false; cmbCustoemerType.Enabled =

我正在开发一个软件,在完成一项特定任务后,我想清除每一件事情,比如清除所有字段、列表视图等,我必须写下许多要清除的事情,比如我的新按钮的代码是:

 private void btnNew_Click(object sender, EventArgs e)
    {
        txtProductCode1.ReadOnly = false;
        txtInvoiceNo.ReadOnly = false;
        cmbCustoemerType.Enabled = false;
        cmbCustomerName.Enabled = false;
        button1.Enabled = true;
        txtProductCode1.Text = null;
        txtWageName.Text = null;
        txtWageCost.Text = null;
        btnFirst.Visible = false;
        btnPrevious.Visible = false;
        btnNext.Visible = false;
        btnLast.Visible = false;
        cmbProductName.Enabled = true;
        txtQty.ReadOnly = false;
        txtPercant.ReadOnly = false;
        txtDiscount.ReadOnly = false;
        cmbCustoemerType.Enabled = true;
        cmbCustomerName.Enabled = true;
        button5.Enabled = true;
        btnDelete.Enabled = true;
        dtp1.Enabled = true;
        btnSave.Text = "&Save";

        cmbCustoemerType.Text = null;
        cmbCustomerName.Text = null;
        txtInvoiceNo.Clear();
        txtDiscount.Clear();
        txtGrandTotal.Clear();
        txtProductName.Clear();
        txtSalePrice.Clear();
        txtQty.Clear();
        txtTotal.Clear();

        txtExtraWages.Text = null;
        lvExtraWages.Items.Clear();
        lvTransaction.Items.Clear();
        lblCount.Text = null;
        lblNetTotal.Text = null;
        txtPercant.Text = null;

        txtInvoiceNo.Text = invoice.ToString();
    }
有没有办法避免再次编写代码,就像我需要在另一个按钮上启用一个我在这里禁用的东西,所以我必须编写反向代码来完成任务,这真的很烦人!还有别的办法吗

编辑: 已尝试以下代码:

private void btnNew_Click(object sender, EventArgs e)
        {   
           //using setboxdefault function
            SetTextBoxDefaults();

            cmbCustoemerType.Text = null;
            cmbCustomerName.Text = null;
        cmbCustoemerType.Enabled = false;
        cmbCustomerName.Enabled = false;
        cmbProductName.Enabled = true;
        cmbCustoemerType.Enabled = true;
        cmbCustomerName.Enabled = true;

        button5.Enabled = true;
        btnDelete.Enabled = true;  
        button1.Enabled = true;          
        btnFirst.Visible = false;
        btnPrevious.Visible = false;
        btnNext.Visible = false;
        btnLast.Visible = false;          


        btnSave.Text = "&Save";

        lvExtraWages.Items.Clear();
        lvTransaction.Items.Clear();

        lblCount.Text = null;
        lblNetTotal.Text = null;

        dtp1.Enabled = true;

        txtInvoiceNo.Text = invoice.ToString();
    }

    private void SetTextBoxDefaults()
    {
        var textBoxes = GetControls(this, typeof(TextBox));
        foreach (var textBox in textBoxes)
        {
            TextBox.Clear();
        }
    }

    public IEnumerable<Control> GetControls(Control control, Type type)
    {
        var controls = control.Controls.Cast<Control>();
        return controls.SelectMany(ctrl => GetControls(ctrl, type)).Concat(controls).Where(c => c.GetType() == type);
    }

请让我知道我错在哪里了

记住保持干燥


将重置逻辑划分为适当的小方法,用于重置控件的逻辑分组。然后在需要的地方调用这些方法。

我在几种情况下所做的是:

void SetTextBoxReadOnly(bool val, param TextBox[] textBoxes)
{
    if(textBoxes != null && textBoxes.Length > 0)
    {
        foreach(TextBox textBox in textBoxes)
        {
            if(textBox != null)
            {
                textBox.ReadOnly = val;
            }
        }
    }
}

void SetControlEnabled(bool val, param Control[] ctrls)
{
    if(ctrls != null && ctrls.Length > 0)
    {
        foreach(Control ctrl in ctrls)
        {
            if(ctrl != null)
            {
                ctrl.Enabled = val;
            }
        }
    }
}

// etc set of methods for similar situations.
// there methods can be invoked as

...
...
...

SetTextBoxReadOnly(true, txtProductCode1,
                         txtInvoiceNo,
                         txtQty,
                         txtPercant,
                         txtDiscount);

正如Tim所建议的,您可以遍历控件并相应地设置每个控件

public IEnumerable<Control> GetControls(Control control,Type type)
{
    var controls = control.Controls.Cast<Control>();
    return controls.SelectMany(ctrl => GetControls(ctrl,type)).Concat(controls).Where(c => c.GetType() == type);
}

private void btnNew_Click(object sender, EventArgs e)
{
    SetComboBoxDefaults();
    SetTextBoxDefaults();
    SetButtonDefaults();
}

private void SetComboBoxDefaults()
{
    var comboBoxes = GetControls(this, typeof(ComboBox));
    foreach (var comboBox in comboBoxes)
    {
        ((ComboBox)comboBox).Enabled = false;
        ((ComboBox)comboBox).Text = null;
    }
}

private void SetTextBoxDefaults()
{
    var textBoxes = GetControls(this, typeof(TextBox));
    foreach (var textBox in textBoxes)
    {
        ((TextBox)textBox).Clear();
    }
}

private void SetButtonDefaults()
{
    var buttons = GetControls(this, typeof(Button));
    foreach (var button in buttons)
    {
        ((Button)button).Visible = false;

        if (button.Name == "btnSave") ((Button)button).Text = "&Save";
    }
}

你试过在控件集合中循环吗?@Tim不,遗憾的是我不知道这可能就是你要找的:从他不知道自己在做什么来看,可能是winforms。是的,但如果是1500行的财产转让,之后你可能会得到远远少于一半的结果。@AhsanMughal-这种方法可能会有一些负面的副作用,但我还没有看到任何东西。此外,它还帮助我保持代码的干净和相关性。哇,最后是一些漂亮和干净的代码。。。我一定要试试this@JackFrost如果控件名称不同于同一类型的所有其他控件(如SetButtonDefaults()所示),则可能需要根据控件名称添加一些特定条件现在出现此错误,错误1“System.Windows.Forms.Control”不包含“Clear”的定义,并且找不到接受“System.Windows.Forms.Control”类型的第一个参数的扩展方法“Clear”(是否缺少using指令或程序集引用?),但是如果我必须将一些文本框设置为空,而不是全部设置为空@d、 蒙卡达
public IEnumerable<Control> GetControls(Control control,Type type)
{
    var controls = control.Controls.Cast<Control>();
    return controls.SelectMany(ctrl => GetControls(ctrl,type)).Concat(controls).Where(c => c.GetType() == type);
}

private void btnNew_Click(object sender, EventArgs e)
{
    SetComboBoxDefaults();
    SetTextBoxDefaults();
    SetButtonDefaults();
}

private void SetComboBoxDefaults()
{
    var comboBoxes = GetControls(this, typeof(ComboBox));
    foreach (var comboBox in comboBoxes)
    {
        ((ComboBox)comboBox).Enabled = false;
        ((ComboBox)comboBox).Text = null;
    }
}

private void SetTextBoxDefaults()
{
    var textBoxes = GetControls(this, typeof(TextBox));
    foreach (var textBox in textBoxes)
    {
        ((TextBox)textBox).Clear();
    }
}

private void SetButtonDefaults()
{
    var buttons = GetControls(this, typeof(Button));
    foreach (var button in buttons)
    {
        ((Button)button).Visible = false;

        if (button.Name == "btnSave") ((Button)button).Text = "&Save";
    }
}
private void SetTextBoxDefaults()
{
    var textBoxes = GetControls(this, typeof(TextBox));
    foreach (var textBox in textBoxes)
    {
        ((TextBox)textBox).Clear();
    }
}