Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何循环遍历所有文本框,并使它们运行动作字典中相应的动作?_C#_Winforms_Textbox_Iteration - Fatal编程技术网

C# 如何循环遍历所有文本框,并使它们运行动作字典中相应的动作?

C# 如何循环遍历所有文本框,并使它们运行动作字典中相应的动作?,c#,winforms,textbox,iteration,C#,Winforms,Textbox,Iteration,我有大约60个文本框,如果每个文本框都有自己的代码段,那就太乱了。对于某些事件,操作是相同的,对于其他事件,可以有一个包含操作的字典。问题是我不知道如何迭代文本框,获取当前文本框引用,并运行一些方法来更改当前文本框的文本 UPD:我想做的是让所有文本框运行alltextboxsenter方法,该方法将根据文本框的名称更改文本,运行alltextboxslave方法,该方法将根据文本框的名称从动作字典执行一些动作。你的问题还不清楚,但我怀疑你想要的是: foreach (var textBox i

我有大约60个文本框,如果每个文本框都有自己的代码段,那就太乱了。对于某些事件,操作是相同的,对于其他事件,可以有一个包含操作的字典。问题是我不知道如何迭代文本框,获取当前文本框引用,并运行一些方法来更改当前文本框的文本


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时再次更改?是的。此外,当按下菜单按钮时,它还需要遍历所有文本框并执行特定于每个文本框的操作。更新了获得/失去焦点部分的答案。当按下按钮时,您需要详细说明文本框需要做什么。