我看了一下,发现一个问题是类似的,但没有解决我的问题-另一个问题是datagridview-is-blank-after-changing-datasource-at-runtime
我相信这是一个简单的问题,有一个更简单的答案..在我的第一个Windows窗体应用程序上工作,发现一些东西与ASP.NET有很大的不同:)
因此,在这个应用程序中,我有以下内容:
- 主要形式
- 在此窗体上单击,打开第二个窗体以设置应用程序设置
- 第二个表单有一个选项卡控件(2个选项卡),带有各种文本框/复选框/组合列表/按钮
- 所有这些工作完美。
- 在第二个表单的第二个选项卡上,沿着更多的文本框等,我添加了一个DataGridView;名为printerListGrid
在此表单的代码视图中,我试图将列表(打印机)绑定到它
printerListGrid.DataSource = AppContext.printers.printerList
当我运行我的应用程序并转到表单/选项卡时,DataGridView是空白的。
我也试过:
printerListGrid.Columns.Clear()
printerListGrid.AutoGenerateColumns = True
printerListGrid.DataSource = AppContext.printers.printerList
又是空白的。
在调试时,我可以看到我的printerList包含2个printer
对象。通过查看.DataSource
属性的内容,我还可以看到这些已被设置为printerListGrid。然而,DataGridView仍然是空白的。
我猜一定有办法重新渲染网格
为了代码公开;这就是List(Of Printer)
中的内容
Public Structure Printer
Public id As Integer
Public name As String
Public material As Enums.Materials
Public outputFolder As String
End Structure
让我知道,如果有任何更多的代码/描述,你需要提供帮助。
更新:
我忘了说。我试图在Private Sub
中设置DataSource
,该Private Sub
在表单Load事件MyBase.Load
上调用
更新#2
我继续玩这个,试图让它工作-我可能完全误解了控制和它的目的。不过,我也尝试了以下方法:
printerListGrid.AutoGenerateColumns = False
Dim col As DataGridViewColumn = New DataGridViewTextBoxColumn()
col.DataPropertyName = "name"
col.HeaderText = "Name"
printerListGrid.Columns.Add(col)
col = New DataGridViewTextBoxColumn()
col.DataPropertyName = "material"
col.HeaderText = "Material"
printerListGrid.Columns.Add(col)
col = New DataGridViewTextBoxColumn()
col.DataPropertyName = "outputFolder"
col.HeaderText = "Output Folder"
printerListGrid.Columns.Add(col)
printerListGrid.DataSource = AppContext.printers.printerList
这导致至少网格显示行;看起来像2。然而,它们并没有填充来自List(Of Printer)
的数据。
3条答案
按热度按时间pbgvytdp1#
发现我做错了什么基本上试试这个:
k2fxgqgv2#
被绑定的字段必须是属性,而不是公共变量。例如,如果您将结构替换为以下结构,您将在网格中看到id。你必须为其他变量做同样的属性切换,才能让它们显示出来。
z9smfwbn3#
这个答案是为VS 2022更新的。我也有同样的问题,但这里的文档和帮助有点过时了。所以,这里是我对这是如何工作的简化分解。
首先,在类定义中,我将DataTable和BindingSource作为私有实体:
接下来,在类构造函数(即“Sub New”)中,在InitializedComponent调用之后,我定义了DataTable,设置了DataGridView并将DataSource链接到BindingSource:
如果我不使用BindingSource,而只是将DataSource设置为DataTable,我将获得添加的行,但它们将是空白的。我在设计器中设置了DataViewGrid。
我使用BackgroundWorker获取数据并将其存储在DataSource中(这在ProgressChanged事件中完成):
从哪里获取数据并不重要,但您必须将其添加到DataTable,特别是如果您正在处理来自外部源(如来自网站或平面文件)的数据。
一旦backgroundWorker完成了他(她?)任务,在RunWorkerCompleted上,我将DataGridView的DataSource设置为BindingSource,然后重置绑定以刷新:
就是这样DataViewGrid拥有所有数据,即使我在Designer中设置了大部分控件。我希望这有助于澄清任何人试图在未来这样做。以前的一些回复已经过时了,我正在努力更新我认为有用的大部分主题。