创建一个过程来减少C#中的冗余代码

时间:2017-09-02 20:00:00

标签: c#

当我单击Windows窗体上的复选框时,它会启用一个文本框并将光标置于其中以备输入。代码相对简单:

private void chkLatte_CheckedChanged(object sender, EventArgs e)
    {
        if(chkLatte.Checked)
        {
            txtLatte.Enabled = true;
            txtLatte.Focus();
        }
        else
        {
            txtLatte.Enabled = false;
            txtLatte.Text = "0";
        }
    }

现在,这就是问题。我有很多这些复选框,所以我想要的是这样的:

 public void setCheckBox(string chkName, string txtName)
    {

        if (chkName.Checked)
        {
            txtName.Enabled = true;
            txtName.Focus();
        }
        else
        {
            txtName.Enabled = false;
            txtName.Text = "0";
        }
    }

现在,我可以调用该方法并传递适当的参数,如下所示:

  private void chkMocha_CheckedChanged(object sender, EventArgs e)
    {
        setCheckBox(chkMocha,txtMocha);
    }

当然,这不起作用:.Checked .Enabled .Focus()等只能使用复选框对象,我将chkName定义为字符串

我应该如何重新编写程序setCheckBox来克服这个问题?

2 个答案:

答案 0 :(得分:6)

为什么不按原样传递对象发件人?

我的意思是这样的:

public void setCheckBox(CheckBox chk, TextBox txt)
{

    if (chk.Checked)
    {
        txt.Enabled = true;
        txt.Focus();
    }
    else
    {
        txt.Enabled = false;
        txt.Text = "0";
    }
}

当然是铸造:

在设计师中你有类似的东西:

private System.Windows.Forms.TextBox txtMocha;

由于这个原因,你将解决很多问题。

private void chkMocha_CheckedChanged(object sender, EventArgs e)
{
    setCheckBox((CheckBox)sender, txtMocha);
}

此外,我必须说,你提供的代码不起作用......你已经想到了。

如果要将参数作为字符串传递,请使用:

Get a Windows Forms control by name in C#

答案 1 :(得分:1)

解决此问题的一种方法是为所有复选框分配相同的处理程序,甚至

checkbox1.Check += chk_CheckedChanged;
checkbox2.Check += chk_CheckedChanged;
private void chk_CheckedChanged(object sender, EventArgs e)
{
   // do your logic here
}