C# 制作索引控件数组?

C# 制作索引控件数组?,c#,arrays,winforms,user-controls,C#,Arrays,Winforms,User Controls,是否有C#索引控件数组?我想放一个“按钮数组”,例如5个按钮,它们只使用一个事件处理程序来处理所有这5个控件的索引(就像VB6一样)。否则,我必须为这5个按钮中的每个按钮编写一个额外的事件处理程序。如果我有100个按钮,我需要100个事件处理程序?我的意思是: TextBox1[i].Text="Example"; 它可以让我更容易地使用控制阵列进行编码。现在我看到,C#至少在用户控件上没有可见的数组功能,在用户控件上没有“index”属性。所以我猜C#没有控件数组,或者我必须按已知名称调用每

是否有C#索引控件数组?我想放一个“按钮数组”,例如5个按钮,它们只使用一个事件处理程序来处理所有这5个控件的索引(就像VB6一样)。否则,我必须为这5个按钮中的每个按钮编写一个额外的事件处理程序。如果我有100个按钮,我需要100个事件处理程序?我的意思是:

TextBox1[i].Text="Example";
它可以让我更容易地使用控制阵列进行编码。现在我看到,C#至少在用户控件上没有可见的数组功能,在用户控件上没有“index”属性。所以我猜C#没有控件数组,或者我必须按已知名称调用每个元素

我没有在for循环中给出100个文本框,而是要写:

TextBox1.Text = Value1;
TextBox2.Text = Value2;
...
...
TextBox100.Text = Value100;

更多的工作+所有这100个事件处理程序,每个都有一个额外的文本框。

只需创建一个处理程序并将所有按钮指向它

var ButtonHandler = (sender, args) => {
    var clicked = (Button)sender;
    if (clicked.Text == "whatever")
       //do stuff
    else
       //do other stuff 
};

button1.Click += ButtonHandler;
button2.Click += ButtonHandler;

或者,如果您在代码中创建控件,您可以使用。

只需创建一个处理程序,并将所有按钮指向它

var ButtonHandler = (sender, args) => {
    var clicked = (Button)sender;
    if (clicked.Text == "whatever")
       //do stuff
    else
       //do other stuff 
};

button1.Click += ButtonHandler;
button2.Click += ButtonHandler;
或者,如果要在代码中创建控件,可以使用

我必须写:

for(int i=0;i
我必须写:


for(int i=0;i如果您使用的是Web窗体,而不是MVC,则可以访问页面上的控件集合,如所示。本质上,控件集合是一个树,其中页面承载第一级子控件,某些项具有自己的子控件。有关如何遵循该树的示例,请参阅

另外,请参见

只要所需签名相同,就可以对多个项目使用相同的事件处理程序


对于Windows窗体,这几乎是相同的,因为它们基于类似的体系结构模型,但您需要和。

如果您使用的是Web窗体而不是MVC,则可以访问页面上的控件集合,如中所示。本质上,控件集合是一个树,其中页面承载第一级子控件和some具有自己子项的项目。有关如何遵循树的示例,请参阅

另外,请参见

只要所需签名相同,就可以对多个项目使用相同的事件处理程序


对于Windows窗体,这几乎是相同的,因为它们基于相似的体系结构模型,但您需要和。

正如我在对HatSoft解决方案的评论中提到的,C#Winforms不允许您像旧的VB6允许的那样创建控件数组。我认为我们能得到的最接近的是HatSoft和Bert Evans在他们的帖子中所说的wn

我希望能够满足您的需求的一件事是事件处理程序,您可以获得一个公共事件处理程序,在事件处理程序中,当您键入“sender”时,您可以直接获得控件,就像在VB6中一样

C#

VB6

因此,您可能遇到的唯一问题是将这100个文本框连接到单个事件处理程序,如果您不是通过代码动态创建控件,而是在设计时手动创建控件,那么您可以建议将它们分组到一个容器(如Panel)中。然后在Form Load中将它们连接到单个事件处理程序,如下所示:

foreach (Control control in myTextBoxPanel.Controls)
{
    if(control is TextBox)
         control.TextChanged += new EventHandler(control_TextChanged);
}

正如我在HatSoft对解决方案的评论中提到的,C#Winforms不允许您像旧的VB6允许的那样创建控件数组。我认为我们能得到的最接近的是HatSoft和Bert Evans在他们的帖子中所展示的内容

我希望能够满足您的需求的一件事是事件处理程序,您可以获得一个公共事件处理程序,在事件处理程序中,当您键入“sender”时,您可以直接获得控件,就像在VB6中一样

C#

VB6

因此,您可能遇到的唯一问题是将这100个文本框连接到单个事件处理程序,如果您不是通过代码动态创建控件,而是在设计时手动创建控件,那么您可以建议将它们分组到一个容器(如Panel)中。然后在Form Load中将它们连接到单个事件处理程序,如下所示:

foreach (Control control in myTextBoxPanel.Controls)
{
    if(control is TextBox)
         control.TextChanged += new EventHandler(control_TextChanged);
}

另一件需要注意的事情:如果你真的需要在一个表单上编辑100个字符串,你可能应该考虑100个文本框是否真的是最好的方法。也许ListView、DataGridView或PropertyGrid更适合


这几乎适用于您认为需要大量控件的任何时候。

另一件需要注意的事情:如果您真的需要在一个表单上编辑100个字符串,您可能应该考虑100个文本框是否真的是最好的方式。也许ListView、DataGridView或PropertyGrid更适合


这几乎适用于任何你认为需要大量控件的时候。

我知道我参加这个聚会有点晚了,但这个解决方案会起作用:

创建全局数组:

    TextBox[] myTextBox;
然后在对象的构造函数中,调用

    InitializeComponent();
初始化阵列:

    myTextBox = new TextBox[] {TextBox1, TextBox2, ... };
现在,您可以迭代控件数组:

    for(int i = 0; i < myTextBox.Length; i++)
        myTextBox[i].Text = "OMG IT WORKS!!!";
for(int i=0;i
我希望这有帮助


皮特

我知道我参加这个聚会有点晚了,但这个解决方案会奏效:

创建全局数组:

    TextBox[] myTextBox;
然后在对象的构造函数中,调用

    InitializeComponent();
初始化阵列:

    myTextBox = new TextBox[] {TextBox1, TextBox2, ... };
现在,您可以迭代控件数组:

    for(int i = 0; i < myTextBox.Length; i++)
        myTextBox[i].Text = "OMG IT WORKS!!!";
for(int i=0;i
我希望这有帮助

皮特保持简单:

TextBox[] keybox = new TextBox[16];   //create an array

for (int i=0; i<16; i++) 
{
    keybox[i] = new TextBox();        //initialize (create storage for elements)
    keybox[i].Tag = i;                //Tag prop = index (not available at design time)
    keybox[i].KeyDown += keybox_down; //define event handler for array
}

private void keybox_down(object sender, KeyEventArgs e)
{
    int index = (int)((TextBox)sender).Tag    //get index of element that fired event
    ...
}
TextBox[]keybox=newtextbox[16];//创建一个数组
对于(int i=0;i保持简单:

TextBox[] keybox = new TextBox[16];   //create an array

for (int i=0; i<16; i++) 
{
    keybox[i] = new TextBox();        //initialize (create storage for elements)
    keybox[i].Tag = i;                //Tag prop = index (not available at design time)
    keybox[i].KeyDown += keybox_down; //define event handler for array
}

private void keybox_down(object sender, KeyEventArgs e)
{
    int index = (int)((TextBox)sender).Tag    //get index of element that fired event
    ...
}
TextBox[]keybox=newtextbox[16];//创建一个数组

for(int i=0;i每个父控件都有一个属性,用于访问子控件的集合。如果将所有文本框/按钮放置在同一父控件中