制作索引控制数组?

时间:2012-07-23 21:41:02

标签: c# arrays winforms user-controls

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

TextBox1[i].Text="Example";

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

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

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

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

7 个答案:

答案 0 :(得分:6)

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

制作全局数组:

    TextBox[] myTextBox;

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

之后
    InitializeComponent();

初始化你的数组:

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

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

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

我希望这有帮助!

皮特

答案 1 :(得分:4)

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

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

C#

TextBox textBox = sender as TextBox;

VB6

TextBox textBox = TextBox1[i];

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

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

答案 2 :(得分: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

答案 3 :(得分:2)

  

我不得不在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)
        {
////
        }
    }

答案 4 :(得分: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

答案 5 :(得分:0)

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

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

答案 6 :(得分: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
    ...
}