2013-10-07 11 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