【问题标题】:How to handle a group of textbox/label in an array如何处理数组中的一组文本框/标签
【发布时间】:2013-10-07 07:51:32
【问题描述】:

我有一系列文本框和标签,从文本框 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 = "" ;
    }

【问题讨论】:

  • 即使您编写了一个“通用”方法来处理点击事件,您仍然需要为每个标签注册该方法。然后,您将直接调用 textBoxX.Text = ""; 替换为直接调用将执行此操作的方法...
  • 您使用的是 WPF 还是 windows 窗体?请更新标签

标签: c# winforms


【解决方案1】:

您可以利用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's,第二列是 TextBox'es。然后只需填写 9 行并在 OnClickfun (找到 sender 位置,找到 texbox 位置,找到文本框并最终清除它)。

【讨论】:

  • 我喜欢使用标签的解决方案,这也是我的首选。 FindTextBoxWithID 的示例实现: TextBox FindTextBoxWithID(Control parentContainer, string txbID) { return parentContainer.Controls.OfType().Where(a => ((string)a.Tag).Equals(txbID)).FirstOrDefault() ; }
  • turcguide.com/stack/lblidx.jpg 我得到 2 以下错误“int.parse(string) 的最佳重载方法匹配有一些无效参数”和参数“1”:无法从“对象”转换为“字符串” '。
  • 谢谢。我用你的两种方法来创建我自己的。我提防通过这种方式进行标记和控制。
【解决方案2】:

也许为所有人使用一个处理程序并使用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 = "" ;
}

虽然依赖那些无意义的变量名并不是最好的做法。

【讨论】:

    【解决方案3】:

    为了减少您的代码冗余,您可以循环访问应用程序中的控件:

    Control Class,所以当点击标签时,你必须搜索文本框的标签 您将为每个文本框设置。

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

    【讨论】:

      【解决方案4】:

      快速解决方案:

      将您的标签重命名为:label_1label_2、...label_22,然后您可以对所有点击使用以下通用事件处理程序。

      对此的改进是将labelNr 传递给一个单独的数字,然后使用它按名称查找文本框,而不是使用开关来检查所有这些。我现在没有时间尝试,但我相信你能以某种方式解决它.. ;)

          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;
              }
          }
      

      更新:似乎 Tim Schmelter 在这里找到了答案。从他那里窃取一个小细节:使用上面显示的Controls.Find("textBox" + labelNr, true),而不是这里的开关,你应该设置好。

      【讨论】:

        【解决方案5】:

        还有一个 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 = '';
            }
        

        【讨论】:

        • 虽然没有明确说明,但我认为他指的是 winforms 应用程序,而不是 web 应用程序。
        • 哎呀 :) 对不起,如果是这样的话(啤酒)。
        • 不需要任何借口。我只是指出问题的范围。不过,啤酒总是受欢迎的。 :)
        【解决方案6】:

        我建议你创建一个用户控件

        • 排列标签和文本框
        • 处理 label_click 事件

        并在您的表单上使用该 UserControl。

        类似这样的:

        public class LableAndTextBox : UserControl
        {
         public LableAndTextBox()
         {
           InitializeComponents();
         }
        
         public void label_Click(object sender, EventArgs e)
         {
           textBox.Text = string.Empty;
         }
        }
        

        编辑 - 确保在单独的程序集中创建 userControl - 出于编译原因..

        【讨论】:

          【解决方案7】:

          使用@sinatr 的两种解决方案,我创建了另一种方法,因为两者都给出了错误消息。

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

          这行得通!

          当然!我在这里添加了 juste

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

          form_load这个

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

          【讨论】:

            【解决方案8】:

            如果您不喜欢编写代码,我有一个程序可以快速编写它。 例如,如果您输入“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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-05-02
              • 1970-01-01
              • 1970-01-01
              • 2010-11-02
              • 2013-10-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多