绑定到 DataTable 的 DataGridView 未显示
Posted
技术标签:
【中文标题】绑定到 DataTable 的 DataGridView 未显示【英文标题】:DataGridView bound to DataTable is not showing 【发布时间】:2015-05-04 15:39:03 【问题描述】:我试图在绑定到 DataTable 的表单中显示 DataGridView,但它没有显示出来。我正在使用 C1TrueDBGrid 执行此操作,并且正在工作......由于 TrueDBGrid 的一些复杂性,我决定切换到使用 DataGridView。谁能帮我弄清楚为什么什么都没有显示?
以我声明的形式:
Public binData As DataSet
Friend WithEvents dgvData As System.Windows.Forms.DataGridView
binData 填充了通过单独的计算例程创建的表。那么这是表单加载事件:
'create a tab page and add data grid view for every table in the set
For i = 0 To binData.Tables.Count - 1
Dim tabPage As C1.Win.C1Command.C1DockingTabPage = New C1.Win.C1Command.C1DockingTabPage
tabPage.Text = binData.Tables(i).TableName
tabContent.TabPages.Add(tabPage)
Dim dgvData = New System.Windows.Forms.DataGridView
Dim binding As New BindingSource
binding.DataSource = binData.Tables(i)
With dgvData
.Dock = DockStyle.Fill
.AllowUserToOrderColumns = False
.AllowUserToAddRows = False
.AllowUserToDeleteRows = False
.DefaultCellStyle.Alignment = DataGridViewContentAlignment.BottomLeft
.DataSource = binding
.AutoGenerateColumns = True
End With
tabPage.Controls.Add(dgvData)
Next 'DataTable In binData.Tables
当表单加载时,标签页就在那里并按预期标记,但它们看起来是空的(没有表格)。
我确实尝试将 DataSource 设置为名为 binData 的 DataSet(而不是特定表),然后将 dgvData 的 DataMember 属性设置为我要在其中显示的特定表的名称......这没有区别.
注意:我需要能够在运行时以编程方式执行此操作,而不是使用可视化设计器,因为在表单加载特定数据集之前我不知道我需要的确切网格数量 - 它获得的数据集可以有不同数量的表格取决于用户的需求。
【问题讨论】:
您将绑定源的数据源设置为表,但没有将网格本身的数据源设置为任何内容。 @Jeremy - 在 With 块中,我设置了 dgvData 的 .DataSource = 绑定。为了使网格的数据源成为表格,我还需要做更多的事情吗? dgvData 应该是表单 (GUI) 上的控件,而不是变量。删除 dgvData 的 Dim/Friend 语句,并从工具箱的 Data 文件夹中向表单添加一个控件。 @rheitzmann - 我不应该能够创建控件并以编程方式将它们添加到表单中吗?就像我说的那样,使用 C1TrueDBGrid(这是 ComponentOne 的第三方控件)可以正常工作。只是它们的控件的属性和行为不同......所以我不确定我在 DataGridView 中缺少什么。 ...虽然这确实让我知道在“Dim dgvData = New System.Windows.Forms.DataGridView”的表单加载事件中摆脱“Dim”。不幸的是,这并没有什么区别。 :( 【参考方案1】:下面是一些将 dgvs 添加到流面板的粗略代码:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Static dgvCount As Integer
dgvCount += 1
Dim dgvNew As New DataGridView
dgvNew.Width = DataGridView1.Width
dgvNew.Height = DataGridView1.Height
dgvNew.Name = "dgv" & dgvCount
' clone other properties as need
FlowLayoutPanel1.Controls.Add(dgvNew)
Debug.Print(FlowLayoutPanel1.Controls(FlowLayoutPanel1.Controls.Count - 1).Name)
End Sub
以一个 dgv - DataGridView1 作为属性模型开始。锚定在流程面板中不起作用,因此可能需要一些自定义代码来更改宽度。
Flow 面板不滚动,因此可能不是最佳选择 - 可以考虑 TableLayout。 TabControl 是另一种选择。
【讨论】:
【参考方案2】:好吧,事实证明我所做的并没有错。问题出在一行代码中,与绑定 DGV 的数据源或任何东西无关。
ComponentOne 有一个名为 ThemeController 的控件,您可以在其中为表单和其中的控件设置主题。我有一行代码将 dgvData 的主题设置为我的默认应用程序主题(设置视觉样式和有关颜色、字体等的详细信息)。无论出于何种原因,这使我的网格不可见。我会和他们一起记录一张票。
【讨论】:
以上是关于绑定到 DataTable 的 DataGridView 未显示的主要内容,如果未能解决你的问题,请参考以下文章
在 DataTable 更改 WPF 后更新绑定到 DataTable 的 DataGrid
将行号列添加到绑定到 DataTable 的 DataGridView