Какой самый простой .NET-эквивалент массива управления VB6? - PullRequest
8 голосов
/ 02 сентября 2008

Возможно, я просто еще недостаточно хорошо знаю .NET, но мне еще предстоит найти удовлетворительный способ легко реализовать этот простой код VB6 в .NET (предположим, что этот код находится в форме с N CommandButtons в массиве Command1 ( ) и N TextBox в массиве Text1 ()):

Private Sub Command1_Click(Index As Integer)

   Text1(Index).Text = Timer

End Sub

Я знаю, что это не очень полезный код, но он демонстрирует простоту использования массивов управления в VB6. Какой простейший эквивалент в C # или VB.NET?

Ответы [ 8 ]

5 голосов
/ 02 сентября 2008

Составьте общий список текстовых полей:

var textBoxes = new List<TextBox>();

// Create 10 textboxes in the collection
for (int i = 0; i < 10; i++)
{
    var textBox = new TextBox();
    textBox.Text = "Textbox " + i;
    textBoxes.Add(textBox);
}

// Loop through and set new values on textboxes in collection
for (int i = 0; i < textBoxes.Count; i++)
{
    textBoxes[i].Text = "New value " + i;
    // or like this
    var textBox = textBoxes[i];
    textBox.Text = "New val " + i;
}
4 голосов
/ 02 сентября 2008

Еще одна приятная вещь, которую делает VB .NET - это наличие одного обработчика событий, который обрабатывает несколько элементов управления:

Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 
        Handles TextBox1.TextChanged, _

        TextBox2.TextChanged, _

        TextBox3.TextChanged

End Sub
3 голосов
/ 02 сентября 2008

В .Net нет реального 1 к 1 аналогу. Конечно, вы можете создавать массивы или списки элементов управления определенного типа, но нет ничего, что сделает это автоматически.

Однако я никогда не видел массива элементов управления, который не мог бы быть реорганизован в .Net для чего-то лучше . В качестве примера можно привести ваш пример. В опубликованном сценарии вы используете управляющие массивы, чтобы связать кнопку с текстовым полем. В .Net вы, вероятно, сделали бы это с помощью пользовательского элемента управления. Пользовательский элемент управления будет состоять из кнопки, текстового поля и, возможно, общего / статического таймера. Форма использует несколько экземпляров этого пользовательского элемента управления. Вы реализуете логику, необходимую для элемента управления, один раз, и она изолируется от собственного исходного файла, который можно отслеживать и редактировать в исходном элементе управления, не требуя слияния с большим классом формы, или его можно легко использовать повторно в нескольких формах или даже в нескольких проектах. , Вам также не нужно беспокоиться о том, чтобы индекс командной кнопки совпадал с индексом текстового поля.

Использование настраиваемого элемента управления для этого вместо массива элементов управления аналогично использованию класса для группировки данных вместо массива, поскольку вместо индексов вы получаете имена.

2 голосов
/ 02 сентября 2008

Есть два аспекта.

.NET с готовностью поддерживает массивы элементов управления, VB6 просто пришлось использовать обходной путь, потому что в противном случае подключение событий было действительно трудным. В .NET динамическое связывание событий легко.

Однако конструктор форм .NET не поддерживает массивы элементов управления по простой причине: массивы элементов управления создаются / расширяются во время выполнения. Если вы знаете, сколько элементов управления вам нужно во время компиляции (рассуждения продолжаются), тогда вы даете им разные имена и не помещаете их в массив.

Я знаю, что это не очень полезный код

В том-то и дело. Зачем иметь функцию, если она бесполезна?

При необходимости вы также можете получить доступ к элементу управления по имени, что приведет к чему-то вроде этого:

Private Sub Command_Click(sender As Object, e As EventArgs) Handles Command1.Click, Command2.Click …
    Dim name As String = DirectCast(sender, Control).Name
    Dim index As Integer = Integer.Parse(name.Substring("Command".Length))
    Controls(String.Format("Text {0}", index)).Text = Timer.Value.ToString()
End Sub
1 голос
/ 02 сентября 2008

Библиотека совместимости VisualBasic .NET содержит строго типизированные массивы элементов управления. Это то, что мастер обновления использует для замены текущих массивов управления VB6.

Однако управляющий массив в VB6 - это просто набор объектов, в которых VB6 выполняет магию синтаксиса на поверхности. В мире .NET, удалив это, они навязывают лучшие практики.

В заключение, с появлением дженериков, ничто не мешает вам использовать

List<YourControl> MyControlArray.
0 голосов
/ 20 января 2010

Два основных преимущества управляющих массивов в VB6: (1) Они предоставили вам возможность перебирать коллекцию элементов управления (2) Они позволили вам делиться событиями между элементами управления

(1) может быть выполнено в .Net с использованием массива элементов управления (2) может быть достигнуто, если одно событие обрабатывает несколько элементов управления (синтаксис немного отличается, потому что вместо myArray(index) используется аргумент sender).

Одна приятная вещь в .Net - это то, что эти функции не связаны. Так, например, у вас могут быть элементы управления, которые совместно используют события, даже если они не являются частью массива и имеют разные имена и даже другой тип. И вы можете перебирать коллекцию элементов управления, даже если они имеют совершенно разные события.

0 голосов
/ 02 сентября 2008

Одно и то же событие нажатия может обрабатывать нажатия кнопок от нескольких кнопок в .Net. Затем вы можете добавить текстовое поле для поиска в свойстве Tag?

Private Sub AllButton_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click
  Dim c As Control = CType(sender, Control)
  Dim t As TextBox = FindControl(CType(c.Tag, String))
  If t Is Not Nothing Then
     t.Text = "Clicked"
  End If
End Sub
0 голосов
/ 02 сентября 2008

Создайте массив элементов управления.

TextBox[] textboxes = new TextBox[] {
    textBox1,
    textBox2,
    textBox3
};
...