Почему мой datagridview не заполняется после установки источника данных?

#vb.net #datagridview #datagrid #datasource #windows-forms-designer

#vb.net #datagridview #datagrid #источник данных #windows-forms-designer

Вопрос:

Я работаю над vb.net Приложение Windows forms. У меня есть datagridview, который я пытаюсь заполнить с помощью datatable и не могу заставить его отображать данные. Я попытался назначить datatable непосредственно datagridview и использовать источник привязки. Я проверил имена столбцов и попытался обновить сетку после установки источника данных. Если я вернусь к коду, я увижу, что в источнике данных есть данные, но данные не будут отображаться в сетке. Что я делаю не так?

Вот создание таблицы базы данных:

 Dim dsReturns As New DataSet("Returns Dataset")
Dim dtReturns = dsReturns.Tables.Add("Returns Datatable")
dtReturns.Columns.Add("Quantity")
dtReturns.Columns.Add("ItemName")
Dim drReturns As DataRow = dtReturns.NewRow
drReturns("Quantity") = qtyh(key).ToString
drReturns("ItemName") = ItemFunctions.GetItemName(item_id)
dsReturns.Tables("Returns Datatable").Rows.Add(drReturns)
  

Это создает таблицу данных, которая выглядит следующим образом:

введите описание изображения здесь

Вот код, присваивающий datatable datagridview. Я пробовал это как с использованием источника привязки, так и без него.

 dgvReturns = new DataGridView()
Dim bsReturns As New BindingSource()
bsReturns.DataSource = dsReturns.Tables("Returns Datatable")
dgvReturns.DataSource = bsReturns
  

Вот код из конструктора, который создает datagridview. Я не писал код, все это генерируется автоматически. Я создал новый datagridview в режиме конструктора, а затем добавил два столбца.

 Friend WithEvents dgvReturns As DataGridView
Friend WithEvents Quantity As DataGridViewTextBoxColumn
Friend WithEvents ItemName As DataGridViewTextBoxColumn

Me.dgvReturns = New System.Windows.Forms.DataGridView()
Me.Quantity = New System.Windows.Forms.DataGridViewTextBoxColumn()
Me.ItemName = New System.Windows.Forms.DataGridViewTextBoxColumn()
CType(Me.dgvReturns,System.ComponentModel.ISupportInitialize).BeginInit
Me.dgvReturns.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
Me.dgvReturns.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {Me.Quantity, Me.ItemName})
Me.Quantity.DataPropertyName = "Quantity"
Me.Quantity.HeaderText = "Quantity Returned"
Me.Quantity.Name = "Quantity"
Me.ItemName.HeaderText = "Item Name"
Me.ItemName.Name = "ItemName"
Me.dgvReturns.Location = New System.Drawing.Point(13, 13)
Me.dgvReturns.Name = "dgvReturns"
Me.dgvReturns.Size = New System.Drawing.Size(465, 150)
Me.dgvReturns.TabIndex = 1
Me.Controls.Add(Me.dgvReturns)
CType(Me.dgvReturns,System.ComponentModel.ISupportInitialize).EndInit
  

Вот скриншот таблицы в конструкторе:

введите описание изображения здесь

Все, что я получаю, — это пустая сетка:

введите описание изображения здесь

Обновление # 1 — отображение всего кода для формы

Вот полный код формы, показывающий конструктор.

 Public Class frmReturnsDialog
    Public Sub New(dsReturns As DataSet)
        InitializeComponent()
        dgvReturns = new DataGridView()
        Dim bsReturns As New BindingSource()
        bsReturns.DataSource = dsReturns.Tables("Returns Datatable")
        dgvReturns.DataSource = bsReturns
    End Sub
End Class
  

Комментарии:

1. dgvReturns = new DataGridView() Это выглядит как новая сетка, которая не является частью коллекции элементов управления. Вам это не нужно, если элемент управления уже существует в форме.

2. Без этой строки я получаю ошибку «объект не существует» в строке dgvReturns. DataSource = bsReturns . Источник данных отображается как null, когда я быстро просматриваю его. Нашел ответ на SO, в котором говорится, что новый DataGridView не был создан. Если мне не нужно объявление «new», есть идеи, как обойти ошибку?

3. Куда вы вставили код, который заполняет DataSet / DataTable и назначает источник данных? Какое-то место, где исходный DGV уже создан или нет? Та же форма? Как сказал LarsTech, это: dgvReturns = new DataGridView() это новый, другой DGV. Не тот, который вы определили в конструкторе.

4. Вы не должны получать сообщение об ошибке «объект не существует» при удалении этой dgvReturns = new DataGridView() строки, поскольку эта сетка уже должна существовать в форме, поскольку дизайнер может ее изменить.