2017-09-02 82 views
2

當我單擊Windows窗體上的一個複選框時,它將啓用一個文本框並將其中的光標設置爲可供輸入。代碼相對簡單:創建一個程序來減少C#中的冗餘代碼

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來解決此問題?

回答

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

一種方法來解決,這是相同的處理分配給所有的複選框甚至

​​
+0

這並不回答原始問題:單個處理程序無法知道要對哪個文本框執行操作,除非邏輯有從發送者的身份中推導出的方式。這種機制(例如將CheckBoxes連接到文本框的字典)應該是您的解決方案的一部分,以使其完成... –

0

您可以創建表單中的一個字典,它從CheckBox映射到TextBox。例如:

whateverMap[chkLatte] = txtLatte; 
... 

考慮到這一點,那麼你可能只是有一個事件處理程序,用下面的代碼:

Dictionary<CheckBox, TextBox> whateverMap = new Dictionary<CheckBox, TextBox>(); 

加載窗體時,例如,你可以填寫此

var checkBox = sender as CheckBox; 
var textBox = whateverMap[checkBox]; 

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

你也可以簡化一點,而不是去:

var checkBox = sender as CheckBox; 
var textBox = whateverMap[checkBox]; 

textBox.Enabled = checkBox.Checked; 

if (textBox.Enabled) 
    textBox.Focus(); 
else 
    textBox.Text = "0"; 
+1

請注意,它是一個複選框和文本框 – Nkosi