Скрыть и отобразить несколько DataGridView

Kirill87

Добрый день! Так как с vb.net начал работать относительно недавно столкнулся с проблемкой: Есть форма, разбитая на 2 панели. В одной из панелей создан DataGridView, заполняемый пользователем, а в другой панели программно создается n-ое кол-во DataGridView, также для заполнения пользователем и последующей обработкой данных. Создание новых DataGridView во 2ой панели происходит при добавлении новых строк в DataGridView в 1ой панели. Так вот, суть вопроса в том, как программно скрывать или отображать необходимые DataGridView из 2ой панели (постоянно вылетает ошибка "В экземпляре объекта не задана ссылка на объект.").Вот фрагмент кода:
'Создание первой DataGridView во 2ой панели
Private Sub СоздатьToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles СоздатьToolStripMenuItem.Click
        SplitContainer1.Visible = True
        SplitContainer1.Panel2.Controls.Add(New_DataGridView)
 
 
        New_DataGridView.ColumnCount = 7
        With New_DataGridView
            .Name = "DataGridView0"
            .AutoSizeRowsMode =
                    DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders
            .Columns(0).HeaderText = "Год"
            .Columns(1).HeaderText = "Р, МПа"
            .Columns(2).HeaderText = "t, град.С"
            .Columns(3).HeaderText = "Мо, г/м3"
            .Columns(4).HeaderText = "Mk"
            .Columns(5).HeaderText = "Gk, г/м3"
            .Columns(6).HeaderText = "Wпласт в % от конд."
            .SelectionMode = DataGridViewSelectionMode.FullRowSelect
            .MultiSelect = False
            .Dock = DockStyle.Fill
        End With
    End Sub
 
'Добаление новой строки в DataGridView001 в первой панели
    Private Sub ToolStripButton5_Click(sender As Object, e As EventArgs) Handles ToolStripButton5.Click
        N_Uzla = CInt(DataGridView001.RowCount) 'определение кол-ва существующих узлов
        DataGridView001.Rows.Add(1)
        DataGridView001.Item(0, N_Uzla).Value = "Узел " & N_Uzla + 1
 
        '----- Добавление новой таблицы DataGridView в панели2
        
        SplitContainer1.Panel2.Controls.Add(New_DataGridView)
 
 
        New_DataGridView.ColumnCount = 7
        With New_DataGridView
            .Name = "DataGridView" & N_Uzla
            .AutoSizeRowsMode =
                    DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders
            .Columns(0).HeaderText = "Год"
            .Columns(1).HeaderText = "Р, МПа"
            .Columns(2).HeaderText = "t, град.С"
            .Columns(3).HeaderText = "Мо, г/м3"
            .Columns(4).HeaderText = "Mk"
            .Columns(5).HeaderText = "Gk, г/м3"
            .Columns(6).HeaderText = "Wпласт в % от конд."
            .SelectionMode = DataGridViewSelectionMode.FullRowSelect
            .MultiSelect = False
            .Dock = DockStyle.Fill
        End With
 
    End Sub
 
 
Private Sub DataGridView001_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView001.CellContentClick
        
        N_Tek_Uzla = CInt(DataGridView001.CurrentCell.RowIndex) 'определение текущего строки
        N_Uzla = CInt(DataGridView001.RowCount) 'Общее кол-во строк в DataGridView001
 
        MsgBox(N_Tek_Uzla)
        For Vibor_Ish = 0 To N_Uzla - 1
            If Vibor_Ish = N_Tek_Uzla Then
                Me.SplitContainer1.Panel2.Controls("DataGridView" & Vibor_Ish.ToString).Visible = True 'Ошибка здесь 
 
            ElseIf Vibor_Ish <> N_Tek_Uzla Then
                Me.SplitContainer1.Panel2.Controls("DataGridView" & Vibor_Ish.ToString).Visible = False 'Ошибка здесь 
 
            End If
        Next
 
    End Sub
А также, как через Controls добавлять строки в определенный DataGridView?
Me.Controls("DataGridView" & N_Tek_Uzla.ToString).Rows.Add(1) 'Не работает
Заранее спасибо, за помощь!
14 ответов

Kirill87

как программно скрывать или отображать
DataGridView1.Visible = False 'True
как через Controls добавлять строки в определенный DataGridView
надо знать количество колонок в таблице и для каждой колонки присваивать значение, пусть даже пустое. Допустим колонок у нас 4 штуки, тогда код будет выглядеть так:
Me.Controls("DataGridView" & N_Tek_Uzla.ToString).Rows.Add(New String() {"1", "2", "3", "4"})
здесь цифры - это значения ячеек в новой строке.


Kirill87

DataGridView1.Visible = False 'True
Это понятно и работает, а как через "Controls", так как DataGridView во 2ой панели может быть и 50 и более...?
Me.Controls("DataGridView" & N_Tek_Uzla.ToString).Rows.Add(New String() {"1", "2", "3", "4"})
Здесь беда именно в ".Rows.Add()" после "Controls" - не проглатывает система...


Kirill87

Создание новых DataGridView во 2ой панели происходит при добавлении новых строк в DataGridView в 1ой панели.
А зачем такое нужно, почему бы не создать "DataSet" и обновлять его из DataGridView второй панели, а вторая панель в свою очередь будет содержать всего одну таблицу, заполненную данными из DataSet для конкретного пользователя. Тем самым вам не нужно будет создавать миллион таблиц и скрывать их, ведь это занимает не мало паняти...
Здесь беда
ах да, у вас ведь таблица находится в контейнера, панели... тогда
Me.ПАНЕЛЬ.Controls("DataGridView" & N_Tek_Uzla.ToString).Rows.Add(New String() {"1", "2", "3", "4"})


Kirill87

Отдельные таблицы нужны для: 1. Просмотра и оперативного редактирования значений, в случае необходимости 2. Для работы с формулами, так там перекрестные ссылки на значения из разных по порядку таблиц.
ах да, у вас ведь таблица находится в контейнера, панели... тогда vb.netВыделить код 1 Me.ПАНЕЛЬ.Controls("DataGridView" & N_Tek_Uzla.ToString).Rows.Add(New String() {"1", "2", "3", "4"})
Пробовал! Все равно не хочет "Controls" работать с ".Rows". Сеqчас буду пробовать через Select.


Kirill87

Kirill87, ну это вы конечно перемутили, 50+ таблиц... Ну если так удобно, тогда конечно "Хозяин барин" а почему Visible не работает? что именно пишет? Может по той же причине, что у вас таблица находится в контейнере (панели) укажите полный путь к таблице типа:
Me.ИмяПанели.Controls("DataGridView" & N_Tek_Uzla.ToString).Visible = False 'True


Kirill87

Прописано, но не робит! Проверил с TextBox - все норм...


Kirill87

А вот что происходит с ".Rows"


Kirill87

Kirill87, я дико извиняюсь, конечно же, забыл указать тип контрола, вот так работает:
CType(Me.Controls("DataGridView1"), DataGridView).Rows.Add(New String() {1, 2, 3})


Kirill87

а насчет Скрыть\Показать - я думаю всетаки у вас неправильно указано имя таблицы, что такое "Vybor_Ish" и чему оно равно???? Возможно у вас нет "DataGridView0", а в коде указано, что такой вариант тоже проверяется, отсюда и ошибка отсутствия объекта с таким именем


Kirill87

Спасибо, с этим разобрались... Остался вопрос про Visible...


Kirill87

заметил на скрине что вы называете таблицу "DataGridView001" - отсюда и проблема - ведь тип Integer не может содержать двойных\тройных нулей, и проходя цикл, ваш "Vybor_Ish" будет равен например "1" вместо нужного вам "001"... Будьте внимательнее и подправьте код с учетом того.Что-то вроде этого сделайте
For Vybor_Ish = 0 to 5
    Me.Controls("DataGridView" & Vybor_Ish.ToString("000")).Visible = False 'True
Next


Kirill87

001 - это как раз DataGridView в первой панели, с ним проблем вроде нет! Vibor_Ish - (можно назвать "i") - перебор номеров строк в DataGridView из первой панели, собственно от 0 до надцатого... DataGridView во второй панели создаются программно с присваиванием номера.
N_Uzla = CInt(DataGridView001.RowCount) 'определение кол-ва существующих строк
        DataGridView001.Rows.Add(1)
        DataGridView001.Item(0, N_Uzla).Value = "Узел " & N_Uzla + 1
 
        SplitContainer1.Panel2.Controls.Add(New_DataGridView)
 
 
        New_DataGridView.ColumnCount = 7
        With New_DataGridView
            .Name = "DataGridView" & N_Uzla
        End With
И получается в операторе "Если" при совпадении i-го номера строки с текущим выбором в DataGridView из первой панели, должен отображаться DataGridView(i-ый) в панели 2.
N_Tek_Uzla = CInt(DataGridView001.CurrentCell.RowIndex) 'определение выбранной строки в DataGridView в первой панели
        N_Uzla = CInt(DataGridView001.RowCount) 'Общее кол-во строк в DataGridView в первой панели
 
        MsgBox(N_Tek_Uzla)
        For Vibor_Ish = 0 To N_Uzla - 1
            If Vibor_Ish = N_Tek_Uzla Then
                Me.SplitContainer1.Panel2.Controls("DataGridView" & Vibor_Ish.ToString).Visible = True
 
            ElseIf Vibor_Ish <> N_Tek_Uzla Then
                Me.SplitContainer1.Panel2.Controls("DataGridView" & Vibor_Ish.ToString).Visible = False
 
            End If
        Next


Kirill87

ответ дал, у меня работает... у вас тоже будетиспользуйте
Vybor_Ish.ToString("000")
для добавления недостающих нулей в имени контролая про то, что например DataGridView0 и DataGridView000 - это две разные таблицы...


Kirill87

Полностью согласен про 0 и 000. Но создаются таблицы 0, 1, 2 и т.д. и их мне надо скрыть\отобразить. а первая таблица 001 - чтобы небыло программно создано таблицы с таким же именем.