C# 如何循环遍历所有文本框,并使它们运行动作字典中相应的动作?
我有大约60个文本框,如果每个文本框都有自己的代码段,那就太乱了。对于某些事件,操作是相同的,对于其他事件,可以有一个包含操作的字典。问题是我不知道如何迭代文本框,获取当前文本框引用,并运行一些方法来更改当前文本框的文本C# 如何循环遍历所有文本框,并使它们运行动作字典中相应的动作?,c#,winforms,textbox,iteration,C#,Winforms,Textbox,Iteration,我有大约60个文本框,如果每个文本框都有自己的代码段,那就太乱了。对于某些事件,操作是相同的,对于其他事件,可以有一个包含操作的字典。问题是我不知道如何迭代文本框,获取当前文本框引用,并运行一些方法来更改当前文本框的文本 UPD:我想做的是让所有文本框运行alltextboxsenter方法,该方法将根据文本框的名称更改文本,运行alltextboxslave方法,该方法将根据文本框的名称从动作字典执行一些动作。你的问题还不清楚,但我怀疑你想要的是: foreach (var textBox i
UPD:我想做的是让所有文本框运行
alltextboxsenter
方法,该方法将根据文本框的名称更改文本,运行alltextboxslave
方法,该方法将根据文本框的名称从动作字典执行一些动作。你的问题还不清楚,但我怀疑你想要的是:
foreach (var textBox in Controls.OfType<TextBox>())
{
textBox.Text = /* insert action here */
}
foreach(Controls.OfType()中的var textBox)
{
textBox.Text=/*在此处插入操作*/
}
现在还不清楚动作字典是从哪里来的…你可以用这段代码试试
foreach( var control in this.Controls.OfType<TextBox>() )
{
control.Text = "";
}
foreach(this.Controls.OfType()中的var控件)
{
control.Text=“”;
}
假设我正确理解了问题,下面是我对问题解释的答案
private void Form1_Load(object sender, EventArgs e)
{
foreach (TextBox tb in this.Controls.OfType<TextBox>())
{
tb.Enter += new EventHandler(textBoxAll_Enter);
tb.Leave += new EventHandler(textBoxAll_Leave);
}
}
private void textBoxAll_Enter(object sender, EventArgs e)
{
((TextBox)sender).Text = "textbox gained focus";
}
private void textBoxAll_Leave(object sender, EventArgs e)
{
((TextBox)sender).Text = "textbox lost focus";
}
private void Form1\u加载(对象发送方,事件参数e)
{
foreach(this.Controls.OfType()中的文本框tb)
{
tb.Enter+=新事件处理程序(textBoxAll\u Enter);
tb.Leave+=新事件处理程序(textBoxAll\u Leave);
}
}
私有void textBoxAll_Enter(对象发送方,事件参数e)
{
((TextBox)sender.Text=“TextBox获得焦点”;
}
私有void textBoxAll_Leave(对象发送方,事件参数e)
{
((TextBox)sender.Text=“TextBox失去焦点”;
}
我想我理解被问到的问题:
已更新
此版本更好,因为它可以处理通过设计器创建的文本框(模拟InitializeControl),并且它使用字典来定位字典中找到的文本框。如果文本框包含在子容器中,则Find非常有用
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
class Form1 : Form
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
private static readonly Dictionary<string, string> TextBoxEnterText = new Dictionary<string, string>
{
{ "T1", "Enter T1" },
{ "T2", "Enter T2" },
{ "T3", "Enter T3" },
{ "T4", "Enter T4" },
{ "T5", "Enter T5" },
};
private static readonly Dictionary<string, string> TextBoxLeaveText = new Dictionary<string, string>
{
{ "T1", "Leave T1" },
{ "T2", "Leave T2" },
{ "T3", "Leave T3" },
{ "T4", "Leave T4" },
{ "T5", "Leave T5" },
};
private void InitializeControls()
{
Controls.Add(new TextBox { Name = "T1", Location = new Point(10, 10) });
Controls.Add(new TextBox { Name = "T2", Location = new Point(10, 40) });
Controls.Add(new TextBox { Name = "T3", Location = new Point(10, 70) });
Controls.Add(new TextBox { Name = "T4", Location = new Point(10, 100) });
Controls.Add(new TextBox { Name = "T5", Location = new Point(10, 130) });
}
public Form1()
{
InitializeControls();
foreach (string name in TextBoxEnterText.Keys)
Controls.Find(name, true).First().Enter += textBox_Enter;
foreach (string name in TextBoxLeaveText.Keys)
Controls.Find(name, true).First().Leave += textBox_Leave;
}
static void textBox_Leave(object sender, EventArgs e)
{
TextBox textBox = (TextBox)sender;
textBox.Text = TextBoxLeaveText[textBox.Name];
}
static void textBox_Enter(object sender, EventArgs e)
{
TextBox textBox = (TextBox)sender;
textBox.Text = TextBoxEnterText[textBox.Name];
}
}
使用系统;
使用System.Collections.Generic;
使用系统图;
使用System.Linq;
使用System.Windows.Forms;
类别表格1:表格
{
[状态线程]
静态void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(新Form1());
}
私有静态只读字典TextBoxEnterText=新字典
{
{“T1”,“输入T1”},
{“T2”,“输入T2”},
{“T3”,“输入T3”},
{“T4”,“输入T4”},
{“T5”,“输入T5”},
};
私有静态只读词典TextBoxLeaveText=新词典
{
{“T1”,“离开T1”},
{“T2”,“离开T2”},
{“T3”,“离开T3”},
{“T4”,“离开T4”},
{“T5”,“离开T5”},
};
私有void initializeControl()
{
添加(新文本框{Name=“T1”,位置=新点(10,10)});
添加(新文本框{Name=“T2”,位置=新点(10,40)});
添加(新文本框{Name=“T3”,位置=新点(10,70)});
添加(新文本框{Name=“T4”,位置=新点(10100)});
添加(新文本框{Name=“T5”,位置=新点(10130)});
}
公共表格1()
{
初始化控件();
foreach(TextBoxEnterText.Keys中的字符串名称)
控件.Find(name,true).First().Enter+=textBox\u Enter;
foreach(TextBoxLeaveText.Keys中的字符串名称)
控件.Find(name,true).First().Leave+=textBox\u Leave;
}
静态无效文本框(对象发送者,事件参数e)
{
TextBox TextBox=(TextBox)发送方;
textBox.Text=TextBoxLeaveText[textBox.Name];
}
静态无效文本框\输入(对象发送者、事件参数)
{
TextBox TextBox=(TextBox)发送方;
textBox.Text=textboxentext[textBox.Name];
}
}
它在调用时出现。例如,Enter
事件。有几个事件将使用dictionary,还有像。Leave
这样使用common的事件methods@user1306322什么字典?你告诉我们有一本字典,但没有关于它的映射。这个答案能告诉你你需要知道的一切吗?信息如此之少,很难再进一步提供帮助…有几个特定事件的字典,它们包含文本框名称作为键和方法作为值。我在想OP上面所说的关于.Enter和.Leave事件,他只需要设置一些事件处理程序来执行操作。您可以将多个文本框指向同一个处理程序,发送者参数将有一个文本框对象的副本,他可以从中获取名称和值。@Kevin我只是不知道如何让调用的文本框生成我想要的文本。问题中没有足够的信息。主要是,它是什么类型的应用程序,ASP.Net,Windows窗体,WPF?这篇文章对于查找所有文本框也很有用:所以我假设你想用相同的文本更新所有文本框,对吗?因为我解释它的方式是,您希望为特定的文本框运行不同的方法。不,每个文本框在输入时根据其名称从一个方法中获取自己的文本。当它失去焦点时,它会被另一个方法处理,这个方法有一个用于调用文本框名称的开关。您希望文本框的文本在聚焦到X时更改,在聚焦到Y时再次更改?是的。此外,当按下菜单按钮时,它还需要遍历所有文本框并执行特定于每个文本框的操作。更新了获得/失去焦点部分的答案。当按下按钮时,您需要详细说明文本框需要做什么。