2013-10-07 36 views
3

我有一系列文本框和標籤形成文本框1-9和標籤1到9.通過單擊任何標籤,我清除相應的文本框。如何處理數組中的一組文本框/標籤

我創建了一個方法,但它像一個嬰兒玩具,與我的TP或VB程序相比。必須有一個結構最短的結構。任何想法將非常感激?

我做什麼:)))

private void label1_Click(object sender, EventArgs e) 
    { 
     textBox1.Text = "" ; 
    } 
    private void label2_Click(object sender, EventArgs e) 
    { 
     textBox2.Text = "" ; 
    } 
    private void label3_Click(object sender, EventArgs e) 
    { 
     textBox3.Text = "" ; 
    } 
    private void label4_Click(object sender, EventArgs e) 
    { 
     textBox4.Text = "" ; 
    } 
    private void label5_Click(object sender, EventArgs e) 
    { 
     textBox5.Text = "" ; 
    } 
    private void label6_Click(object sender, EventArgs e) 
    { 
     textBox6.Text = "" ; 
    } 
    private void label7_Click(object sender, EventArgs e) 
    { 
     textBox7.Text = "" ; 
    } 
    private void label8_Click(object sender, EventArgs e) 
    { 
     textBox8.Text = "" ; 
    } 
    private void label9_Click(object sender, EventArgs e) 
    { 
     textBox9.Text = "" ; 
    } 
+0

即使你寫的處理則仍然需要點擊事件「通用」方法爲每個標籤註冊該方法。然後,您將直接調用到'textBoxX.Text =「」;',直接調用一個方法,直接調用這個方法... –

+0

您是使用WPF還是Windows窗體?請更新標籤 –

回答

2

您可以利用Tag屬性馬克控制。然後你可以遍歷它們(最好從大多數父控件開始,並且使用遞歸!或者,如果你確定,從包含控件組的容器中開始)。

// assign tag "1" to "9" to labels and texboxes 
// subscribe all labels to same event label_Click 
private void label_Click(object sender, EventArgs e) 
{ 
    string id = (sender as Control).Tag.ToString(); 
    // iterate or recurse 
    FindTextboxWithId(id).Clear(); 
} 
// it shouldn't be hard to write FindTextboxWithId 

其他可能性是在窗體構造函數中創建控件的私有數組,以便於引用它們。

public TextBox[] _textBox; 

public Form1() 
{ 
    InitializeComponent(); 
    _textBox = new TextBox[] {textBox1, texBox2, ..., textBox9}; 
} 

// assign tag "0" to "8" to labels and texboxes 
// subscribe all labels to same event label_Click 
private void label_Click(object sender, EventArgs e) 
{ 
    int index = int.Parse((sender as Label).Tag); 
    _textBox[index].Clear(); 
} 

第三種可能性是利用容器,例如TableLayoutPanel。您可以創建2列容器,其中第一列爲Label,第二列爲TextBox'es。然後只需填寫9行,並有樂趣OnClick(找到sender位置,找到texbox的位置,找到文本框,並最終清除它)。

+0

我喜歡使用標籤的解決方案,這也是我的第一選擇。示例實現FindTextBoxWithID:TextBox FindTextBoxWithID(Control parentContainer,string txbID) { return parentContainer.Controls.OfType ().Where(a =>((string)a.Tag).Equals(txbID))。FirstOrDefault() ; } – Arie

+0

http://www.turcguide.com/stack/lblidx.jpg 我得到2以下錯誤「最好的重載方法匹配int.parse(字符串)有一些invalide參數」和參數'1':可以沒有從'對象'轉換爲'字符串'。 –

+0

謝謝。我用你的2種方法來創建我自己的。我謹防以這種方式進行控制和控制。 –

0

所有和使用Controls.Find也許一個處理程序:

private void label_Click(object sender, EventArgs e) 
{ 
    var label = (Label)sender; 
    string lastDigits = new string(label.Name.SkipWhile(c => !Char.IsDigit(c)).ToArray()); 
    var textBox = Controls.Find("textBox" + lastDigits, true).FirstOrDefault() as TextBox; 
    if(textBox != null) 
     textBox.Text = "" ; 
} 

雖然依靠那些毫無意義的變量名是不是最好的做法。

0

爲了使你的代碼少多餘的,你可以遍歷在應用程序中的控件:

Control Class,所以在標籤上點擊時,你將不得不尋找文本框的標籤 ,你會爲每個textBox中設置。

foreach (Control C in this.Controls) 
{ 
    //Code Here... 

} 
0

快速的解決方案:

重新命名的標籤,如:label_1label_2,...... label_22,那麼你可以使用下列常見的事件處理程序的所有點擊。

對此的改進是將labelNr傳遞給一個單獨的數字,然後使用該數字按名稱查找文本框,而不是使用swith檢查所有文本框。我沒有時間現在就試試,但我敢肯定,你自己看着辦吧莫名其妙..;)

private void label1_Click(object sender, EventArgs e) 
    { 
     var labelNr = ((Label) sender).Name.Split('_').Last(); 

     switch (labelNr) 
     { 
      case "1": 
       textBox_1.Clear(); 
       break; 
      case "22": 
       textBox_22.Clear(); 
       break; 
     } 
    } 

更新:似乎添Schmelter有了答案在這裏。爲了竊取他的一個小細節:使用Controls.Find("textBox" + labelNr, true),因爲他在上面顯示而不是這裏的開關,並且應該設置。

0

而一個JavaScript解決方案:

<asp:TextBox ID="txt1" runat="server"></asp:TextBox> 
    <asp:Label ID="lbl1" runat="server" AssociatedControlID="txt1" onclick="clearTextBox(this)">Clear</asp:Label> 

function clearTextBox(sender){ 
     var assocControlId = sender.htmlFor; 
     var el = document.getElementById(assocControlId); 
     if (el) 
      el.value = ''; 
    } 
+0

儘管未明確指定,但我認爲他指的是winforms應用程序,而不是web應用程序。 –

+0

Ooops :) 對不起,如果是這種情況(啤酒)。 – iTURTEV

+0

沒有任何藉口是必要的。我只是指出了問題的範圍。雖然啤酒總是受歡迎。 :) –

0

我建議你創建一個用戶控件

  • 安排一個拉布勒和一個TextBox
  • 處理label_click事件

,並使用該用戶控件的形式代替。

是這樣的:

public class LableAndTextBox : UserControl 
{ 
public LableAndTextBox() 
{ 
    InitializeComponents(); 
} 

public void label_Click(object sender, EventArgs e) 
{ 
    textBox.Text = string.Empty; 
} 
} 

編輯 - 確保您所創建的用戶控件,在一個單獨的組件 - 用於編譯的原因..

0

隨着@sinatr的兩種解決方案,我創建了一個其他方法,因爲兩者都有錯誤信息。

private void label_Click (object sender , EventArgs e) 
    { 
     string id = (sender as Control).Tag.ToString(); 
     int newidx = Convert.ToInt32(id); 
     _textBox[newidx].Clear(); 
    } 

這工作!

當然!我已經添加了這裏探微這

namespace WindowsFormsApplication1 
{ 
public partial class 
DefBiscuit : Form 
{ 
    public TextBox[] _textBox; 

而且

form_load這個

_textBox = new TextBox[] { textBox1, textBox2, textBox3, textBox4, textBox5, textBox6, textBox7, textBox8, textBox9 };

0

如果你不喜歡多寫代碼,我有一個程序可以把它寫快。例如,如果輸入「lable1.Text = textbox1.Text;」和「15」的程序將輸出到一個文本框:

lable1.Text = textbox1.Text; 
lable2.Text = textbox2.Text; 
lable3.Text = textbox3.Text; 
lable4.Text = textbox4.Text; 
lable5.Text = textbox5.Text; 
lable6.Text = textbox6.Text; 
... 
lable15.Text = textbox15.Text; 

轉到這裏瞭解更多信息和下載:Download Counter Replacer