6

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

TextBox1[i].Text="Example";

它可以让我使用控制数组更容易编码。现在我已经看到,C# 至少在用户控件上没有可见的数组功能,并且在用户控件上没有“索引”属性。所以我猜 C# 没有控制数组,或者我必须通过已知名称调用每个元素。

我不必在 for 循环中提供 100 个文本框 100 个递增值,而是必须编写:

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

更多的工作 + 所有这 100 个事件处理程序每​​个额外的一个 TextBox。

4

7 回答 7

8

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

创建一个全局数组:

    TextBox[] myTextBox;

然后在你的对象的构造函数中,在调用之后

    InitializeComponent();

初始化你的数组:

    myTextBox = new TextBox[] {TextBox1, TextBox2, ... };

现在您可以迭代您的控件数组:

    for(int i = 0; i < myTextBox.Length; i++)
        myTextBox[i].Text = "OMG IT WORKS!!!";

我希望这有帮助!

皮特

于 2015-05-10T13:34:43.467 回答
3

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

我希望能满足您的要求的一件事是事件处理程序,您将获得一个通用事件处理程序,并且在事件处理程序中,当您对“发送者”进行类型转换时,您可以直接获得控件,就像在 VB6 中一样

C#

TextBox textBox = sender as TextBox;

VB6

TextBox textBox = TextBox1[i];

因此,您可能遇到的唯一麻烦是将这 100 个文本框连接到一个事件处理程序,如果您不是通过代码动态创建控件,而是在设计时手动创建它,那么所有人都可以建议将它们分组在一个容器中,比如面板。然后在 Form Load 上将它们全部连接到一个事件处理程序,如下所示:

foreach (Control control in myTextBoxPanel.Controls)
{
    if(control is TextBox)
         control.TextChanged += new EventHandler(control_TextChanged);
}
于 2012-07-24T04:10:52.080 回答
2

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

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

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

或者,如果您在代码中创建控件,则可以使用此答案中指定的技术之一

于 2012-07-23T21:44:59.730 回答
2

我不必在 for 循环中提供 100 个文本框 100 个递增值,而是必须编写:

for(int i = 0; i <100; i++)
{
   TextBox t = new TextBox(){ Id = "txt_" + i, Value = "txt_" + i};
   t.TextChanged += new System.EventHandler(this.textBox_Textchanged);
  Page.Controls.Add(t);

}

//and for event on TextChanged
private void textBox_Textchanged(object sender, EventArgs e)
    {
        TextBox textBox = sender as TextBox;

        if (textBox != null)
        {
////
        }
    }
于 2012-07-23T21:48:11.790 回答
1

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

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

于 2013-10-07T19:03:51.147 回答
0

如果您使用的是 Web 窗体而不是 MVC,则可以访问页面上的控件集合,如在 ASP.NET 网页中使用控件集合中所示。本质上,控件集合是一棵树,其中包含第一级子控件的页面和一些具有自己子控件的项目。有关如何遵循树的示例,请参阅如何:通过遍历控件集合在页面上定位 Web 窗体控件。

另请参阅如何:以编程方式将控件添加到 ASP.NET 网页

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

对于 Windows 窗体,这几乎是相同的,因为它们基于相似的架构模型,但您需要Control.Controls 属性如何:将控件添加到 Windows 窗体

于 2012-07-23T21:48:56.070 回答
0

保持简单:

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
    ...
}
于 2018-08-07T22:26:47.117 回答