C # WindowsForms эквивалент для индексированных элементов управления VB6 - PullRequest
3 голосов
/ 23 июля 2010

В VB6 у вас есть возможность присвоить элементам управления индекс.

т.е.: cmdStartInterval (1), cmdStartInterval (2), ....

Тогда у вас есть заголовок метода, подобный этому:

Private Sub cmdStartInterval_Click(Index As Integer)
...
End Sub

Это также возможноаналогично в C #?

Ответы [ 2 ]

3 голосов
/ 23 июля 2010

В c # вы можете назначить все кнопки для одного дескриптора события

protected void cmdButtons_Click(object sender, System.EventArgs e)

, когда нажата кнопка, было вызвано это событие и экземпляр этой кнопки передан этому событию параметром отправителя.

Примечание (добавлено позже)
Хотя вышеизложенное является верным ответом на подмножество проблемы и отличным обходным решением, если сам индекс не нужен, следует отметить, что он не является эквивалент индексированных элементов управления, как следует из названия, но альтернатива .Индексированные элементы управления VB6 являются технически массивами.Следовательно, эквивалентным будет массив в C #, который может быть достигнут только через код, но не через конструктор.

2 голосов
/ 23 июля 2010

Эквивалент - использовать массивы элементов управления. Вам нужно будет добавить указатель в событие вручную. Если вам не нужен индекс, вы можете просто назначить события элементам управления.

Недостатком является как для C #, так и для VB.NET: вы не можете создавать индексированные элементы управления с конструктором, вы должны создавать их вручную.

Преимущество: это дает вам больше свободы.

EDIT:
Вот как это выглядит:

// in your Form_Init:

Button [] buttons = new Button[10];    // create the array of button controls

for(int i = 0; i < buttons.Length; i++)
{

    buttons[i].Click += new EventHandler(btn_Click);
    buttons[i].Tag = i;               // Tag is an object, not a string as it was in VB6

    // a step often forgotten: add them to the form
    this.Controls.Add(buttons[i]);    // don't forget to give it a location and visibility
}

// the event:
void btn_Click(object sender, EventArgs e)
{
    // do your thing here, use the Tag as index:
    int index = (int) ((Button)sender).Tag;
    throw new NotImplementedException();
}

PS: если вы используете дизайнер форм, у каждой кнопки будет свое имя. Если вы делаете так, как предложил другой пользователь, то есть используете один и тот же обработчик для всех них (как вы могли бы сделать и в VB6), вы не можете легко отличить элементы управления по индексу, как вы это делали раньше. Чтобы преодолеть это, просто используйте поле Tag. Обычно лучше использовать , а не поле Имя для этого, так как это создает зависимость, которую вы не хотите.

...