BindingSource с DataTable в VB - PullRequest
       0

BindingSource с DataTable в VB

0 голосов
/ 05 сентября 2011

Преамбула: Я долго не работал с WinForms, а также никогда ранее в VB. Я пытаюсь добавить DataGridView в приложение, написанное на VB, которое будет отображать сетку данных изDataTable.

Я следовал документации здесь , здесь и здесь и в простом тестовом примере у меня есть код

Public Class Form1

    Private count As Integer

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        count = count + 1

        Dim table As DataTable = BindingSource2.DataSource

        Dim row As DataRow
        row = table.NewRow()
        row("Col1") = "foo" + count.ToString()
        row("Col2") = "bar" + count.ToString()

        table.Rows.Add(row) 'throws System.InvalidOperationException here

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        'BindingSource2.DataSource = New DataTable()
        'Dim table As DataTable = BindingSource2.DataSource
        Dim table As New DataTable

        Dim column1 As DataColumn = New DataColumn()
        column1.ColumnName = "Col1"
        column1.Caption = column1.ColumnName
        column1.DataType = System.Type.GetType("System.String")
        table.Columns.Add(column1)

        Dim column2 As DataColumn = New DataColumn()
        column2.ColumnName = "Col2"
        column2.Caption = column2.ColumnName
        column2.DataType = System.Type.GetType("System.String")
        table.Columns.Add(column2)

        'Dim keys(0) As DataColumn
        'keys(0) = column1
        'table.PrimaryKey = keys

        ' first row
        Dim row As DataRow = table.NewRow()
        row("Col1") = "beep"
        row("Col2") = "boop"

        table.Rows.Add(row)

        BindingSource2.DataSource = table
    End Sub
End Class

Код проходит через Form1_Load хорошо, но добавленные записи не отображаются в DataGridView.Затем, когда вызывается Timer1_Tick, выдается исключение System.InvalidOperationException в строке, указанной выше.Я не вижу, что я делаю неправильно, основываясь на примерах, приведенных в документации.

Вопрос: Может кто-нибудь помочь, пожалуйста, с (а) почему DataGridView не отражает добавленноеданные в конце Form1_Load и (b) почему добавление строки вызывает исключение?

Ps Я проверил отладку и в table.Rows.Add(row) table содержитсяправильная информация, как и row.

Редактировать: BindingSource был добавлен и подключен к DataGridView с помощью конструктора, поэтому вместо него код отображается в From1.Designer.vbЯ не показывал здесь.

Ответы [ 2 ]

1 голос
/ 05 сентября 2011

Решение (по крайней мере, в моем случае здесь) состояло в том, что DataGridView.AutoGenerateColumns не отображается на панели дизайна и по умолчанию установлено на False. Я просто добавил строку

DataGridView1.AutoGenerateColumns = True

к моему коду (в Form1_Load), и он работал отлично. Я нашел решение на форуме, но сейчас не могу найти ссылку. Я добавлю его, если найду.

0 голосов
/ 06 сентября 2011

Я не знаю, что сказать. Я использовал ваш код точно, и никаких исключений не происходит. Работает просто отлично. Возможно, проблема в том, что, возможно, значение Timer1.Interval может быть слишком низким в зависимости от того, насколько быстро работает компьютер, на котором выполняется код. Что если вы увеличите интервал?

Что касается данных, которые не отображаются ... добавьте два столбца в DataGridView, установите свойство DataPropertyName каждого столбца DataGridView, чтобы соответствовать каждому из имен столбца таблицы (в диалоговом окне "Редактировать столбцы ..."). Тогда вы получите ваши данные отображаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...