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

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

Private Sub Command1_Click(Index As Integer)

   Text1(Index).Text = Timer

End Sub

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


person raven    schedule 02.09.2008    source источник
comment
Может быть, вы могли бы проверить в будущем мою идею: stackoverflow.com/questions/5738092/vb6-control-arrays-in-net/, я думаю, он дает решение этого непростого вопроса.   -  person Federico Navarrete    schedule 07.03.2017


Ответы (9)


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

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;
}
person Seb Nilsson    schedule 02.09.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
person Mark Biek    schedule 02.09.2008

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

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

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

person Joel Coehoorn    schedule 02.09.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
person Konrad Rudolph    schedule 02.09.2008
comment
Я имел в виду свой пример, когда сказал, что это не очень полезный код. Я обнаружил, что массивы элементов управления чрезвычайно полезны в VB6, поэтому я и задал этот вопрос. Я нашел ваше предложенное решение довольно умным, но это просто похоже на путаницу. - person raven; 17.09.2008

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

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

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

List<YourControl> MyControlArray.
person FlySwat    schedule 02.09.2008

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

TextBox[] textboxes = new TextBox[] {
    textBox1,
    textBox2,
    textBox3
};
person Lasse V. Karlsen    schedule 02.09.2008

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

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

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

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

person Tim Goodman    schedule 20.01.2010

Я знаю, что ответ пришел довольно поздно, но думаю, что нашел решение. Я не единственный бывший разработчик VB6, который боролся с этим ограничением VS. Давным-давно я пытался перенести разработанную мной CRM, но мне это не удалось, потому что у меня была жесткая зависимость от массивов элементов управления (сотни в одной форме). Я прочитал много форумов и смог написать такой простой код:

VB.NET:

'To declare the List of controls
Private textBoxes As List(Of TextBox) = New List(Of TextBox)()

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs)
    'To get all controls in the form
    For Each control In Controls

        'To search for the specific type that you want to create the array 
        If control.[GetType]() = GetType(TextBox) Then
            textBoxes.Add(CType(control, TextBox))
        End If
    Next

    'To sort the labels by the ID
    textBoxes = textBoxes.OrderBy(Function(x) x.Name).ToList()
End Sub

C #:

//To declare the List of controls
private List<TextBox> textBoxes = new List<TextBox>();
private void Form1_Load(object sender, EventArgs e)
{
    //To get all controls in the form
    foreach (var control in Controls)
    {
        //To search for the specific type that you want to create the array 
        if (control.GetType() == typeof(TextBox))
        {
            //To add the control to the List
            textBoxes.Add((TextBox)control);
        }
    }

    //To sort the labels by the ID
    textBoxes = textBoxes.OrderBy(x => x.Name).ToList();
}

Следует учитывать 3 момента:

  1. List поможет вам имитировать большую коллекцию элементов управления.
  2. typeof(Control) поможет вам определить тип элемента управления, который нужно добавить в список.
  3. Пока вы сохраняете индекс в качестве последнего символа (textBox 1, textBox 2, ..., textBox N < / strong>) вы можете создать логический порядок.

Пример в режиме дизайна:

Множество текстовых полей в одном окне

Выполняется:

текущий пример

Подобная логика потенциально может быть использована в других технологиях, таких как WPF, ASP.NET (веб-формы) или Xamarin (формы) - на мой взгляд -. Я надеюсь, что этот фрагмент кода поможет большему количеству программистов в будущем.

person Federico Navarrete    schedule 06.08.2019