制作索引控制数组?

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

TextBox1[i].Text="Example"; 

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

我不得不在for循环100递增值中给出100个TextBox,而是写:

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

还有很多工作+所有这100个事件处理程序,每个处理器额外增加一个TextBox。

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

我希望满足你的要求的一件事是事件处理程序,你得到一个公共事件处理程序,在事件处理程序中,当你对“发送者”进行类型转换时,你就像在VB6中一样直接得到控件

C#

 TextBox textBox = sender as TextBox; 

VB6

 TextBox textBox = TextBox1[i]; 

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

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

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

创建一个全局数组:

  TextBox[] myTextBox; 

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

  InitializeComponent(); 

初始化你的数组:

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

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

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

我希望这有帮助!

皮特

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

 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循环100递增值中给出100个TextBox,而是写:

 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) { //// } } 

如果您正在使用Web窗体而不是MVC,则可以访问页面上的控件集合,如在ASP.NET网页中使用控件集合中所示。 本质上,控件集合是一个树,其中页面托管第一级子控件,一些项目具有自己的子级。 请参阅如何:通过遍历控件集合在页面上查找Web窗体控件,以获取有关如何跟随树的示例。

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

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

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

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

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

保持简单:

 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 ... }