如何处理数组中的一组文本框/标签
本文关键字:文本 一组 标签 何处理 处理 数组 | 更新日期: 2023-09-27 18:34:22
我有一系列文本框和标签,分别来自文本框 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 = "" ;
}
可以利用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 位置,找到文本框并最终清除它)。
也许一个处理程序适用于所有人并使用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 = "" ;
}
尽管依赖那些无意义的变量名称并不是最佳做法。
若要减少代码的冗余,可以遍历应用程序中的控件:
控件类,因此在单击标签时,您必须搜索文本框的标签您将为每个文本框设置。
foreach (Control C in this.Controls)
{
//Code Here...
}
快速解决方案:
重命名标签,例如: label_1
, label_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;
}
}
更新:似乎蒂姆·施梅特勒在这里找到了答案。从他那里窃取一个小细节:使用他上面显示的Controls.Find("textBox" + labelNr, true)
而不是这里的开关,你应该被设置。
还有一个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 = '';
}
我建议你创建一个用户控件
- 排列标签和文本框
- 处理label_click事件
并改用窗体上的该用户控件。
像这样:
public class LableAndTextBox : UserControl
{
public LableAndTextBox()
{
InitializeComponents();
}
public void label_Click(object sender, EventArgs e)
{
textBox.Text = string.Empty;
}
}
编辑 - 确保在单独的程序集中创建 userControl - 出于编译原因。
通过两种@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 };
如果你不太喜欢写代码,我有一个程序可以写得很快。例如,如果您输入"标签1.文本 = 文本框 1。文本;"和"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;
转到此处了解更多信息并下载: 下载计数器更换器