2012-07-23 75 views
4

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

TextBox1[i].Text="Example"; 

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

而不是在给100名的文本框为循环递增100价值,我必须写:

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

很多更多的工作+所有这些100个事件处理程序为每一个额外的文本框额外费用。

+1

每个父母控制有一个属性['.Controls'](http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controls(V = VS .71).aspx),它可以访问一系列子控件。如果将所有文本框/按钮放在同一个父容器中,则可以通过子控件列表引用它们。 – mellamokb 2012-07-23 21:43:22

+2

您可以将相同的事件处理程序分配给多个控件,您无需为每个控件实例创建新的事件处理程序实现。 – 2012-07-23 21:44:14

+0

您可能有一些实施ICollection 的运气,其中T:Control,但不能将一个事件处理程序添加到数组中。 – 2012-07-23 21:44:26

回答

4

正如我在HatSoft提出的解决方案中提到的那样,C#Winforms不允许您创建像旧VB6一样的控件数组。我想我们可以找到的最接近的就是HatSoft和Bert Evans在帖子中显示的内容。

一两件事,我希望将满足您的要求为事件处理程序,你在事件处理程序的常见事件处理程序,当你强制转换的“发件人”你直接得到控制,就像你会在VB6

C#

TextBox textBox = sender as TextBox; 

VB6

TextBox textBox = TextBox1[i]; 

所以你可能是接线的100个文本框到一个单一的事件处理程序,如果你AR唯一的麻烦e不是通过代码动态创建控件,而是在设计时手动创建控件,那么所有人都可以建议将它们分组在容器中,比如说面板。然后在窗体的Load线他们都到一个单一的事件处理程序是这样的:

foreach (Control control in myTextBoxPanel.Controls) 
{ 
    if(control is TextBox) 
     control.TextChanged += new EventHandler(control_TextChanged); 
} 
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; 

另外,如果你在代码中创建控件,您可以使用one of the techniques specified in this answer。的

+0

啊,你提到了usercontrols,我得出了一个结论。 – Bert 2012-07-23 21:51:21

+0

底线,创建一个事件处理程序,并将其分配给控件事件。 – Bert 2012-07-23 22:05:36

+0

@feedwall处理程序接收发件人作为参数。如果您为每个控件分配一个值,则可以检查该值以确定单击哪个控件。 – Bert 2012-07-24 00:18:42

2

而是在给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) 
     { 
//// 
     } 
    } 
+0

@feedwall:不,在设计时你不能像VB6那样拥有一个数组。但是,您可以为所有控件设置通用事件处理程序,但是您需要在设计时或通过代码手动连接它们。 – 2012-07-24 03:55:26

0

如果您正在使用Web窗体的工作,而不是MVC,您可以存取权限一个在页面上收集控件,如Using the Controls Collection in an ASP.NET Web Page所示。基本上,控件集合是一个树,其中托管第一级子控件的页面和一些具有自己的子项的项目。有关如何关注树的示例,请参阅How to: Locate the Web Forms Controls on a Page by Walking the Controls Collection

此外,请参阅How to: Add Controls to an ASP.NET Web Page Programmatically

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

对于Windows窗体,由于它们基于相似的体系结构模型,因此几乎相同,但您需要Control.Controls PropertyHow to: Add Controls to Windows Forms

+0

就基本体系结构而言,Windows窗体和Web窗体模型几乎完全相同。许多技术都适用。我已经增加了一些答案。 – JamieSee 2012-07-23 23:18:49

0

另一件事要注意:如果你真的需要一个编辑窗体上100个字符串,你应该想想100个文本框是否真的是最好的办法。也许ListView,DataGridView或PropertyGrid会更适合。

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

5

我知道我是一个有点晚了这个晚会,但是这种解决方案将工作:

做一个全局数组:

TextBox[] myTextBox; 

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

InitializeComponent(); 

初始化数组:

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

现在你可以重复你的控件数组:

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

我希望这有助于!

皮特