YahyaSh Ответов: 3

Vb.net как создать массив элементов управления с различными типами, например textbox, combobox, checkbox...на основе определенного значения


Это код:
Public Function TestControl(c As Integer())
        Dim a As Control()
        Dim l As Point
        Dim F As New Form
        For i As Integer = 0 To c.Length - 1
            If c(i) Then
                a(i) = New TextBox
            Else
                a(i) = New ComboBox
            End If
            a(i).Width = 400
            a(i).Height = 40
            l.Y = 50 + (3 * i - 2) * a(i).Height / 2
            l.X = 150
            a(i).Location = l
            F.Controls.Add(a(i))
        Next
        F.Show()
        Return Nothing
   End Function

Когда я пытаюсь выполнить эту функцию появляется следующая ошибка:

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

Что я уже пробовал:

Я пытаюсь решить эту проблему, но у меня ничего не получается. любая идея была бы очень полезна для меня

Спасибо

3 Ответов

Рейтинг:
24

Ralf Meier

Вы затемняете массив управления as без измерения. Это и есть предыдущая ошибка.
Но для чего вам нужен этот массив ? Достаточно создать экземпляр элемента управления и добавить его в коллекцию элементов управления формы.

Чтобы исправить ваш код (который имеет неправильный подход в данный момент) Я хотел бы узнать больше о цели ...

Дополнительно после уточнения :

Public Sub CreateControls (c As Integer())
        Dim l As Point

        For i As Integer = 0 To c.Length - 1
            l.Y = 50 + (3 * i - 2) * 40  ' your Control-Height
            l.X = 150

            If c(i) = ??? Then  ' <- add the right value for comparing here
                dim myTB as New TextBox
                myTB.Width = 400
                myTB.Height = 40
                myTB.Location = l
                myTB.Name = "TextBox"+i.toString  ' <- important for later accessing
                me.Controls.Add(myTB)

            Else  ' if c(i)= ???
                dim myCB as New ComboBox
                myCB.Width = 400
                myCB.Height = 40
                myCB.Location = l
                myCB.Name = "ComboBox"+i.toString  ' <- important for later accessing
                me.Controls.Add(myCB)
            End If
        Next
   End Sub


YahyaSh

Здравствуй, Ральф, Ты совершенно прав. когда я определил длину управляющего массива, он работает. но идея в том, что я хочу, чтобы она была динамичной.

что ж, позвольте мне попытаться приблизиться к своей цели:

Я работаю с набором данных, который связан с базой данных. В наборе данных у меня есть много таблиц, которые связаны там, где связаны некоторые поля. например, у меня есть datagridview1, привязанный к таблице "клиент", где у каждого клиента есть уникальная учетная запись без"ACCNO". еще одна таблица " контракты "с полем"AccNo". у одного клиента может быть много контрактов.

функция, которую я хочу создать, - это добавить новую запись и иметь параметр (таблица Как Datatable).

когда я вызову функцию и новая форма будет показана с количеством элементов управления, которые такое же количество Datatable.columns.count....и вот идея: каждый тип элемента управления зависит от типа столбцов. например: для столбца" имя " мне просто нужно текстовое поле. с другой стороны, для контрактов.Колонки ("AccNo") Мне нужен ComboBox, где отображаемый элемент находится от клиента.Колонки ("AccNo").

Надеюсь, моя идея ясна

Ralf Meier

Не совсем ясно, но достаточно, чтобы начать дискуссию ...
Я предлагаю следующее :
- DataGridView и подключение к вашей базе данных являются частью вашей формы - так что этот метод также должен быть частью вашей формы.
- Я полагаю, у вас есть кнопка или что-то подобное, которое загружает базу данных. При загрузке вы запускаете свой метод, который создает необходимые элементы управления

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

YahyaSh

Ральф,

Я все продумал, как ты и предлагал. он отлично работает.

Большое спасибо.

Рейтинг:
1

Graeme_Grant

Вот пример работы с группами объектов-элементов управления в данном случае...

Private controls As List(Of Control) = New List(Of Control)

Sub AddControls()

    controls.Add(New PictureBox)
    controls.Add(New TextBox)
    controls.Add(New Label)

End Sub


Рейтинг:
1

CPallini

Что ж, сообщение об ошибке понятно. Вы объявили массив

Цитата:
Дим, а как контролировать()
но так и не создал его.


Заявление
a = new Control(c.Length){}
отсутствует в вашем коде.

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