comalco2000 Ответов: 1

Как сделать так, чтобы содержимое datatable отображалось в DGV?


Я продолжаю переписывать старый VB6 в .Net как часть моего обучения .Net. Мне удалось прочитать CSV-файл в Datatable, и я могу видеть, что он правильно заполнен с помощью «визуализатора данных», когда я смотрю на «dt», но, похоже, он не заполняет элемент управления DataGridView, который я пытаюсь связать это к. Я провел пару часов, просматривая другие темы и пробуя что-то, но не вижу, что я делаю не так. DataGridView находится в другой форме в приложении, и я читаю файл CSV (своего рода файл конфигурации) из основной формы MDI. Когда я показываю дочернюю форму, содержащую DataGridView, она всегда пуста (на самом деле кажется, что добавлены две строки с данными, но все их содержимое пустое).

' This form is called NAMS
'
Public dt As New DataTable
Public ThisFilename As String = "c:\SitesDB.cfg"

Private Sub GetSitesDB()
        Dim sr As New IO.StreamReader(ThisFilename)
        Dim newline() As String = sr.ReadLine.Split(","c)
        dt.Columns.AddRange({New DataColumn(newline(0)), New DataColumn(newline(1)), New DataColumn(newline(2)), New DataColumn(newline(3)),
            New DataColumn(newline(4)), New DataColumn(newline(5)), New DataColumn(newline(6)), New DataColumn(newline(7)), New DataColumn(newline(8)),
            New DataColumn(newline(9)), New DataColumn(newline(10)), New DataColumn(newline(11))})
        While (Not sr.EndOfStream)

            newline = sr.ReadLine.Split(","c)
            Dim newrow As DataRow = dt.NewRow
            newrow.ItemArray = {newline(0), newline(1), newline(2), newline(3), newline(4), newline(5), newline(6), newline(7), newline(8), newline(9), newline(10), newline(11)}
            dt.Rows.Add(newrow)
        End While
        Form1.DataGridView1.DataSource = dt      ' data can be seen here using datatable visualiser hovering over 'dt'

    End Sub

Private Sub ToolStripButton1_Click(sender As Object, e As EventArgs) Handles ToolStripButton1.Click
        Form1.Show()
    End Sub



Я попытался освежить DGV, но безрезультатно. Мне интересно, имеет ли это какое-то отношение к тому, что Form1.Show() действует после того, как datatable привязан к DGV? или что я пытаюсь сделать публичное заявление в самом начале, и оно недействительно?

Но следующее Не помогло
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        '  chkBit.Checked = False
        ' Dim cfgtext As String : cfgtext = ""
        DataGridView1.DataSource = NAMS.dt
    End Sub


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

Я прочитал много тем и примеров и попробовал несколько разных вещей, но, похоже, ничего не работает. Несколько подходов помещают данные в datatable, но ни один из них, похоже, не связывает их и не отображает в DGV......

Потратил много часов на попытки, но я, очевидно, упускаю что-то основное в этом процессе?? Любая помощь или подсказки оценены по достоинству!

1 Ответов

Рейтинг:
2

OriginalGriff

Переместите настройку источника данных в форму.Показанное событие и удалить имя формы из инструкции:

DataGridView1.DataSource = dt

И не забудьте где - нибудь выполнить метод GetSitesDB-я не вижу, чтобы он вызывался в вашем коде!


"Спасибо. Если я не помещу NAMS. dt в код в форме 1 ..."

Хорошо, давайте внесем некоторые изменения!
Прекратите загрузку значения DT в DGV в GetSitesDB.
И измените доступ к Form1 Datagridview обратно на "частный" - никогда не делайте элементы управления общедоступными!
У вас есть две формы: NAMS и Form1.
Имена содержат переменную dt и GetSitesDB, а также кнопку, которая отображает форму, да?
Форма 1 содержит DGV.
Итак ... измените конструктор Form1, чтобы он принимал DataTable, и сохраните его в частной переменной под названием "data".
Теперь измените обработчик событий ToolStripButton1_Click, чтобы сделать это:
Dim f1 as New Form1(data)
f1.Show()
(Это предполагает, что GetSitesDB уже был вызван, если нет, то вызовите его и здесь)
В форме 1.Показанное событие, установите источник данных:
Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
DataGridView1.DataSource = data
End Sub

Попробуйте и посмотрите, что получится. Дай мне знать!

"изменено на следующее в коде формы 1..."

Что-то вроде этого:
Public Class Form1
    Private dataForDisplay As DataTable
    Private Sub New()
        InitializeComponent()
    End Sub
    Public Sub New(data As DataTable)
        MyBase.New()
        InitializeComponent()
        dataForDisplay = data
    End Sub

    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown
        DataGridView1.DataSource = dataForDisplay
        Dim f1 As New Form1(New DataTable)
    End Sub
End Class


comalco2000

Спасибо. GetSitesDB вызывается из другого toolstripbutton, и я знаю, что он работает, так как DT заполняется нормально. Вы имеете в виду поставить Datagridview1.datasource=dt перед оператором Form1.show ()??

comalco2000

Я добавил Это в форму 1.....

Частная суб Form1_Shown(отправителя как объект, а равно EventArgs) обрабатывает меня.Показано
DataGridView1.Источник данных = НАМН.ДТ
Конец Подводной Лодки

и удалил его от события form1_load

никакое изменение..... Я знаю, что мне есть чему поучиться в .NET, но я должен сказать, что некоторые вещи просто казались проще в VB6 !

OriginalGriff

Если он вызывается с кнопки, то он выполняется только при нажатии кнопки.
И он загружает данные в переменную экземпляра вашего класса под названием "dt", а не в NAMS.dt.
Вот почему я удалил бит "NAMS" из вашего кода!
Проверьте с помощью отладчика, убедитесь, что метод вызван, и используйте точку останова, чтобы увидеть, есть ли что-нибудь в dt или NAMS.dt, когда вы устанавливаете источник данных.
Вы знаете, как использовать отладчик, да?

comalco2000

В приведенном выше событии Form1_Shown данные видны с помощью визуализатора datatable, когда вы наводите курсор мыши на часть оператора DataGridView1Datasource ... он просто никогда не появляется в DGV при открытии формы...но две дополнительные строки видны, но пусты, так что это почти так же, как если бы строки были добавлены в качестве дополнительных строк в DGV, но просто не заполнены (или видны)

comalco2000

Спасибо. Если я не НАМН.ДТ в код в form1, потом я получаю сообщение об ошибке в окне список ошибок ......как показано ниже.

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

Я не очень много играл с отладчиком в .NET, но если я установлю перерыв в конце оператора Form1_Shown, то данные будут находиться в DataGridView.Источник данных при наведении курсора мыши на него в приведенном выше операторе Form1_Shown...и использовании datavisualiser-но символ datavisualiser не появляется при наведении курсора мыши на слово NAMS.dt.....

Описание Кода Серьезности Состояние Подавления Строки Файла Проекта
Ошибка BC30451 'dt' не объявлена. Он может быть недоступен из-за своего уровня защиты. Получить C:\VBnet\Form1.vb 459 Активных

OriginalGriff

Ответ обновлен.

comalco2000

На событие кнопки, которое работает GetSitesDB это не помещается на форме НАМН. Поэтому в коде в NAMS вы можете просто использовать "dt". т.е.
DataGridView1.Источник данных = ДТ
Но если я помещу это утверждение в Form1.... под form1_shown (), то оно вернет ошибку (как уже упоминалось и показано выше), если я не укажу "NAMS. dt"

comalco2000

Является ли моя проблема в том, что я пытаюсь объявить DT общедоступным для всего проекта в начале моего кода NAMs (как показано ниже)? А NAMS.dt, используемый в коде Form1, на самом деле вообще не распознает dt "NAMS"?

Общественные ДТ в качестве нового объекта DataTable

comalco2000

...

comalco2000

изменено на следующее в коде Form1......

Частная суб Form1_Shown(отправителя как объект, а равно EventArgs) обрабатывает меня.Показано
DataGridView1. DataSource = Данные

дает ошибку

Описание Кода Серьезности Состояние Подавления Строки Файла Проекта
Ошибка BC30112 "System. Data" является пространством имен и не может использоваться в качестве выражения. Получить C:\VBnet\Form1.vb 459 Активных

Конец Подводной Лодки

OriginalGriff

ВБ-это глупо! :смеяться:
Он также нечувствителен к регистру, поэтому данные и данные одинаковы... измените данные на dataForDisplay int во всех трех местах (объявление, загрузка в конструктор и показанное событие)
Моя ошибка - Я обычно использую C#, который чувствителен к регистру, поэтому данные и данные очень разделены.

comalco2000

Хорошо, я думаю, что сделал все, кроме того, что я не полностью понимаю эту линию...
Итак ... измените конструктор Form1, чтобы он принимал DataTable, и сохраните его в частной переменной под названием "data".

Так код стал;

Private Sub ToolStripButton1_Click (sender As Object, e As EventArgs) обрабатывает ToolStripButton1.Щелчок
Dim f1 как новая форма 1(Данные)
Ф1.Показать()
Конец Подводной Лодки

Private Sub GetSitesDB()
Дим ДТ в качестве нового объекта DataTable
Дим dataGridView1 как новый элемент()
Тусклый sr как новый IO.Что Streamreader(ThisFilename)
Dim newline () As String = sr. ReadLine.Split (", " c)
dtrow = 1
ДТ.Столбцы.AddRange({новый объект datacolumn(перевод строки(0)), новый datacolumn(строки(1)), Новый datacolumn(строки(2)), Новый datacolumn(перевод строки(3)),
Новый datacolumn(перевод строки(4)), Новый datacolumn(перевод строки(5)), Новый datacolumn(перевод строки(6)), Новый datacolumn(перевод строки(7)), Новый datacolumn(перевод строки(8)),
Новый datacolumn(новая строка(9)), новый datacolumn(перевод строки(10)), Новый datacolumn(перевод строки(11))})
В то время как (не СР.EndOfStream)
строки = СР.С readline.Split (", " c)
Dim newrow As DataRow = dt. NewRow
невров.ItemArray = {перевод строки(0), перевод строки(1), строки(2), строки(3), строки(4), строки(5), перевод строки(6), перевод строки(7), перевод строки(8), перевод строки(9), перевод строки(10), перевод строки(11)}
'построить массив данных сайта
Помощью siteview(dtrow) = перевод строки(0) : имя_сайта(dtrow) = перевод строки(1) : оборудование(dtrow) = перевод строки(2) : IP-адрес(dtrow) = перевод строки(3) : порт(dtrow) = перевод строки(4)
Имя пользователя (dtrow) = новая строка(5): пароль (dtrow) = новая строка(6): PBxPos (dtrow) = новая строка(7) : PByPos (dtrow) = новая строка(8) : PBPic (dtrow) = новая строка (9)
TBxPos (dtrow) = newline(10): TByPos (dtrow) = newline(11)
dt. Rows. Add (newrow) : dtrow = dtrow + 1
Конец Пока
Конец Подводной Лодки

и в формах формируют код.......

Частная суб Form1_Shown(отправителя как объект, а равно EventArgs) обрабатывает меня.Показано
DataGridView1. DataSource = Данные
Конец Подводной Лодки

ошибки........

Описание Кода Серьезности Состояние Подавления Строки Файла Проекта
Ошибка BC30112 "System. Data" является пространством имен и не может использоваться в качестве выражения. Получить C:\VBnet\Form1.vb 459 Активных
Описание Кода Серьезности Состояние Подавления Строки Файла Проекта
Ошибка BC30112 "System. Data" является пространством имен и не может использоваться в качестве выражения. Получить C:\VBnet\UDP_Send_and_Receive_Using_Threads_in_VBNET_src\UDP отправка и получение с помощью потоков в VB. NET_src\UDP Receive\bin\NAMS. vb 68 Active
Описание Кода Серьезности Состояние Подавления Строки Файла Проекта
Ошибка BC30057 слишком много аргументов для ' Public Sub New ()'. Получить C:\VBnet\UDP_Send_and_Receive_Using_Threads_in_VBNET_src\UDP отправка и получение с помощью потоков в VB. NET_src\UDP Receive\bin\NAMS. vb 68 Active

comalco2000

Мне кажется, я упускаю из виду то, что вы мне сказали.
У меня есть только "данные" в двух местах....
DataGridView1. DataSource = Данные
Dim f1 как новая форма 1(Данные)

что и где находится 3-й??

(Вы уже можете сказать, что я новичок в .net, да? Я любил VB6)

OriginalGriff

Ответ обновлен.

comalco2000

спасибо ... но теперь у меня больше ошибок, чем я думаю, что смогу справиться как Новичок
Не знаю, как теперь двигаться вперед... со всеми изменениями на этом пути и количеством ошибок, которые сейчас появляются, я думаю,что мне нужно опубликовать весь мой код, чтобы вы заметили, что у меня сейчас не так...и это очень много строк кода!

comalco2000

мои мозги поджариваются. Я думаю, что мне лучше всего лечь на сено и переосмыслить все это завтра вечером, я очень ценю вашу помощь, но я думаю, что сейчас у меня все в порядке с головой :)

OriginalGriff

Наверное, хорошая идея!

comalco2000

Спасибо снова