Какой самый простой .NET-эквивалент массива управления VB6?

StackOverflow https://stackoverflow.com/questions/39541

Вопрос

Возможно, я просто еще недостаточно хорошо знаю .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?

Это было полезно?

Решение

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

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;
}

Другие советы

Еще одна приятная вещь, которую делает 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

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

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

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

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

.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

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

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

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

List<YourControl> MyControlArray.

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

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

Одно и то же событие нажатия может обрабатывать нажатия кнопок от нескольких кнопок в .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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top