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 = "" ;
    }
4

8 回答 8

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's,第二列是TextBox'es。然后只需填写 9 行并玩得开心OnClick查找sender位置,查找 texbox 位置,查找文本框并最终清除它)。

于 2013-10-07T08:42:00.203 回答
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();
    }

这行得通!

当然!我在这里添加了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 };

于 2013-10-07T10:26:40.327 回答
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 = "" ;
}

尽管依赖那些无意义的变量名并不是最佳实践。

于 2013-10-07T08:02:18.380 回答
0

快速解决方案:

将您的标签重命名为:label_1, label_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)他上面显示的而不是这里的开关,你应该被设置。

于 2013-10-07T08:12:11.507 回答
0

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

Control Class,因此在单击标签时,您必须搜索将为每个文本框设置的文本框标签。

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

}
于 2013-10-07T08:04:17.477 回答
0

我建议你创建一个 UserControl

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

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

像这样的东西:

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

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

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

于 2013-10-07T08:54:21.490 回答
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 = '';
    }
于 2013-10-07T08:25:47.307 回答
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;

前往此处了解更多信息并下载:下载 Counter Replacer

于 2016-02-28T11:40:32.133 回答