我查看并发现一个类似的问题,但没有解决我的问题 - 另一个问题是 datagridview-is-blank-after-change-datasource-at-runtime
我确信这是一个简单的问题,有一个更简单的答案。.在我的第一个 Windows 窗体应用程序上工作并发现一些与 ASP.Net 有很大不同的东西:)
所以在这个应用程序中我有以下内容:
在此表单的代码视图中,我尝试将打印机列表绑定到它
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
如果您还需要提供帮助,请告诉我。
更新:
我忘记说了。我正在尝试在
DataSource
中设置 Private Sub
,它在表单加载事件上调用 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)
... 的数据
发现我做错了什么。基本上试试这个:
Public Structure Printer
Property id As Integer
Property name As String
Property material As Enums.Materials
Property outputFolder As String
End Structure
绑定的字段必须是属性,而不是公共变量。例如,如果您将结构替换为以下内容,您将在网格中看到 id。您还必须对其他变量执行相同的属性切换才能让它们显示出来。
Public Structure Printer
Private _id As Integer
Public Property id() As Integer
Get
Return _id
End Get
Set(ByVal value As Integer)
_id = value
End Set
End Property
Public name As String
Public material As Materials
Public outputFolder As String
End Structure
老狗学会新把戏。
这个答案已针对 VS 2022 进行更新。我也遇到了同样的问题,但这里的文档和帮助有点过时了。所以,这是我对其工作原理的简化分解。
首先,在类定义中,我将 DataTable 和 BindingSource 作为私有实体:
Private dt_Famous As New DataTable("FamousNames")
Private bs_Famous As New BindingSource()
接下来,在类构造函数(即“Sub New”)中,在 InitializedComponent 调用之后,我定义 DataTable,设置 DataGridView 并将 DataSource 链接到 BindingSource:
dt_Famous.Columns.AddRange({
New DataColumn("FamousName", GetType(String)),
New DataColumn("ImageCount", GetType(Integer)),
New DataColumn("FamousLink", GetType(String))
})
grid_Names.AutoGenerateColumns = False
bs_Famous.DataSource = dt_Famous
grid_Names.Columns(0).DataPropertyName = "FamousName"
grid_Names.Columns(1).DataPropertyName = "ImageCount"
grid_Names.Columns(2).DataPropertyName = "FamousLink"
如果我没有使用 BindingSource,只是将 DataSource 设置为 DataTable,我会添加行,但它们将是空白的。我已经在设计器中设置好了 DataViewGrid。
我使用BackgroundWorker来获取数据并将其存储在DataSource中(这是在ProgressChanged事件中完成的):
dt_Famous.Rows.Add({sFamousName, 0, e.UserState(1)})
从哪里获取数据确实并不重要,但您必须将其添加到 DataTable 中,特别是当您正在处理来自外部源(例如来自网站或平面文件)的数据时。
backgroundWorker 完成他(她?)的任务并在 RunWorkerComplted 上后,我将 DataGridView 的数据源设置为 BindingSource,然后重置绑定以刷新:
grid_Names.DataSource = bs_Famous
bs_Famous.ResetBindings(True)
就是这样。即使我在 Designer 中设置了大部分控件之后,DataViewGrid 仍拥有所有数据。我希望这有助于澄清任何将来尝试这样做的人。之前的一些回复已过时,我正在尝试更新大部分我认为有用的主题。