问题描述
我正试图找到一种有效的方法来定义单选按钮的条件。
选择单选按钮后,我应禁用或填充文本框。举一个例子:
private void Transportauftrag_CheckedChanged(object sender,EventArgs e)
{
groupBox1.Visible = true;
groupBox8.Visible = false;
StartGerät.Text = "";
StartBlockFach.Text = "";
StartTiefe.Text = "";
ZielGerät.Text = "";
ZielBlockFach.Text = "";
ZielTiefe.Text = "";
FehlerFehler.Text = "****";
FehlerBereich.Text = "****";
FehlerInfo.Text = "****";
Transportbefehl.Text = "";
Breite.Text = "";
Tiefe.Text = "";
Höhe.Text = "";
Typ.Text = "";
Folgeauftrag.Text = "";
Behälternummer.Text = "";
Reserve.Text = "";
StartGerät.Enabled = true;
StartBlockFach.Enabled = true;
StartTiefe.Enabled = true;
ZielGerät.Enabled = true;
ZielBlockFach.Enabled = true;
ZielTiefe.Enabled = true;
FehlerFehler.Enabled = false;
FehlerBereich.Enabled = false;
FehlerInfo.Enabled = false;
Transportbefehl.Enabled = true;
Breite.Enabled = true;
Tiefe.Enabled = true;
Höhe.Enabled = true;
Typ.Enabled = true;
Folgeauftrag.Enabled = true;
Behälternummer.Enabled = true;
Reserve.Enabled = true;
}
所以现在我应该这样做7次。 为此,我在WindowsFormsApp文件中需要400多个代码行。
解决方法
好的,这里有一些建议。基本上,如果遇到此类问题,则表明您需要一个组织结构。否则会迷路。从GUI图片中可以看到,您已经有GroupBox
个对此进行整理。该组框内的所有标签和文本框都位于groupBox1.Controls
中。即使按类型,您也可以一口气将它们取出:
List<TextBox> allTextBoxesFromGroupBox1 = groupBox1.Controls.OfType<TextBox>().ToList();
现在您可以对其进行迭代,并为每个文本框写入相同的值:
foreach (TextBox tb in allTextBoxesFromGroupBox1)
{
tb.Text = "";
}
但是您最好使用它来做一个方法:
private void FillAllTextBoxes(GroupBox groupBox,string text)
{
List<TextBox> allTextBoxesFromGroupBox1 = groupBox.Controls.OfType<TextBox>().ToList();
foreach (TextBox tb in allTextBoxesFromGroupBox1)
{
tb.Text = "";
}
}
现在您可以简单地调用它并传递必要的输入:
FillAllTextBoxes(groupBoxStart,"");
FillAllTextBoxes(groupBoxZiel,"");
FillAllTextBoxes(groupBoxFehler,"****");
FillAllTextBoxes(groupBoxParameter,"");
在这一点上,我们摆脱了17行,只介绍了4条
继续...下一步将是启用控件。看来您再次将相同组框中的所有文本框都视为相同。因此,我们可以在该方法中为启用部分引入另一个参数:
private void FillAllTextBoxes(GroupBox groupBox,string text,bool enable)
{
List<TextBox> allTextBoxesFromGroupBox1 = groupBox.Controls.OfType<TextBox>().ToList();
foreach (TextBox tb in allTextBoxesFromGroupBox1)
{
tb.Text = "";
tb.Enabled = enable;
}
}
这使我们可以完全删除其余的行,而无需引入新的代码行:
FillAllTextBoxes(groupBoxStart,"",true);
FillAllTextBoxes(groupBoxZiel,true);
FillAllTextBoxes(groupBoxFehler,"****",false);
FillAllTextBoxes(groupBoxParameter,true);
所以现在您只剩下4行代码了(我的屏幕快照中只有4个分组框)