Какой самый простой .NET-эквивалент массива управления VB6?
-
09-06-2019 - |
Вопрос
Возможно, я просто еще недостаточно хорошо знаю .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 заключается в том, что эти функции не связаны между собой. Так, например, у вас могут быть элементы управления, которые совместно используют события, даже если они не являются частью массива и имеют разные имена и даже другой тип. И вы можете перебирать коллекцию элементов управления, даже если они имеют совершенно разные события.