#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()
строки, поскольку эта сетка уже должна существовать в форме, поскольку дизайнер может ее изменить.