none
Присвоение кнопкам из массива, разных обработчиков RRS feed

  • Вопрос

  • К примеру объявлен массив с 30-ю кнопками, дальше в цикле задаются одинаковые свойства для кнопок, а вот события должны быть разными.
    Вопрос собственно состоит в следующем, можно ли в цикле for например, присвоить кнопкам из массива разные обработчики событий, и если можно то как?

    • Перемещено Siddharth Chavan 1 октября 2010 г. 22:47 MSDN Forums Consolidation (От:Visual C#)
    14 января 2010 г. 22:03

Ответы

  • Например можно присвоить через массив делегатов, но предварительно его все равно придется задать:

    public delegate void event_Click(object sender, EventArgs e);
    
    public Form1()
    {
        InitializeComponent();
        Button[] buttons = new Button[3];
        event_Click[] delegates = new event_Click[3]{
            new event_Click(button0_Click),
            new event_Click(button1_Click),
            new event_Click(button2_Click)};
        Int32 location_Y = 13;
        for (Int32 i = 0; i < buttons.Length; i++)
        {
            buttons[i] = new Button();
            buttons[i].Location = new System.Drawing.Point(13, location_Y);
            buttons[i].Name = "button"+i;
            buttons[i].Size = new System.Drawing.Size(75, 23);
            buttons[i].TabIndex = 0;
            buttons[i].Text = "button"+i;
            buttons[i].UseVisualStyleBackColor = true;
            //...
            buttons[i].Click += new System.EventHandler(delegates[i]);
            this.Controls.Add(buttons[i]);
            location_Y += 30;
        }
    }
    
    private void button0_Click(object sender, EventArgs e)
    {
        //...
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
        //...
    }
    
    private void button2_Click(object sender, EventArgs e)
    {
        //...
    }
    

    или если обработчики могут повторяться, то можн воспользоваться свитчем для уменьшения массива делегатов:

    Button[] buttons = new Button[30];
    event_Click[] delegates = new event_Click[3]{
        new event_Click(button0_Click),
        new event_Click(button1_Click),
        new event_Click(button2_Click)};
    Int32 location_Y = 13;
    for (Int32 i = 0; i < buttons.Length; i++)
    {
        buttons[i] = new Button();
        buttons[i].Location = new System.Drawing.Point(13, location_Y);
        buttons[i].Name = "button" + i;
        buttons[i].Size = new System.Drawing.Size(75, 23);
        buttons[i].TabIndex = 0;
        buttons[i].Text = "button" + i;
        buttons[i].UseVisualStyleBackColor = true;
        //...
        switch (i)
        {
            case 0:
            case 1:
            case 2:
            case 3:
                buttons[i].Click += new System.EventHandler(delegates[0]);
                break;;
            case 4:
            case 5:
                buttons[i].Click += new System.EventHandler(delegates[1]);
                break;
            case 6:
                buttons[i].Click += new System.EventHandler(delegates[2]);
                break;
            default:
                buttons[i].Click += new System.EventHandler(delegates[0]);
                break;
        }
        this.Controls.Add(buttons[i]);
        location_Y += 30;
    }

    Может быть есть и другие способы ;)

    • Предложено в качестве ответа I.Vorontsov 15 января 2010 г. 12:35
    • Помечено в качестве ответа I.Vorontsov 18 января 2010 г. 8:31
    15 января 2010 г. 8:41

Все ответы

  • хм, а смысл использовать это в цикле..если все события разные?
    15 января 2010 г. 6:46
  • Например можно присвоить через массив делегатов, но предварительно его все равно придется задать:

    public delegate void event_Click(object sender, EventArgs e);
    
    public Form1()
    {
        InitializeComponent();
        Button[] buttons = new Button[3];
        event_Click[] delegates = new event_Click[3]{
            new event_Click(button0_Click),
            new event_Click(button1_Click),
            new event_Click(button2_Click)};
        Int32 location_Y = 13;
        for (Int32 i = 0; i < buttons.Length; i++)
        {
            buttons[i] = new Button();
            buttons[i].Location = new System.Drawing.Point(13, location_Y);
            buttons[i].Name = "button"+i;
            buttons[i].Size = new System.Drawing.Size(75, 23);
            buttons[i].TabIndex = 0;
            buttons[i].Text = "button"+i;
            buttons[i].UseVisualStyleBackColor = true;
            //...
            buttons[i].Click += new System.EventHandler(delegates[i]);
            this.Controls.Add(buttons[i]);
            location_Y += 30;
        }
    }
    
    private void button0_Click(object sender, EventArgs e)
    {
        //...
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
        //...
    }
    
    private void button2_Click(object sender, EventArgs e)
    {
        //...
    }
    

    или если обработчики могут повторяться, то можн воспользоваться свитчем для уменьшения массива делегатов:

    Button[] buttons = new Button[30];
    event_Click[] delegates = new event_Click[3]{
        new event_Click(button0_Click),
        new event_Click(button1_Click),
        new event_Click(button2_Click)};
    Int32 location_Y = 13;
    for (Int32 i = 0; i < buttons.Length; i++)
    {
        buttons[i] = new Button();
        buttons[i].Location = new System.Drawing.Point(13, location_Y);
        buttons[i].Name = "button" + i;
        buttons[i].Size = new System.Drawing.Size(75, 23);
        buttons[i].TabIndex = 0;
        buttons[i].Text = "button" + i;
        buttons[i].UseVisualStyleBackColor = true;
        //...
        switch (i)
        {
            case 0:
            case 1:
            case 2:
            case 3:
                buttons[i].Click += new System.EventHandler(delegates[0]);
                break;;
            case 4:
            case 5:
                buttons[i].Click += new System.EventHandler(delegates[1]);
                break;
            case 6:
                buttons[i].Click += new System.EventHandler(delegates[2]);
                break;
            default:
                buttons[i].Click += new System.EventHandler(delegates[0]);
                break;
        }
        this.Controls.Add(buttons[i]);
        location_Y += 30;
    }

    Может быть есть и другие способы ;)

    • Предложено в качестве ответа I.Vorontsov 15 января 2010 г. 12:35
    • Помечено в качестве ответа I.Vorontsov 18 января 2010 г. 8:31
    15 января 2010 г. 8:41