设置Datasource后DataGridView为空

问题描述 投票:0回答:3

我查看并发现一个类似的问题,但没有解决我的问题 - 另一个问题是 datagridview-is-blank-after-change-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

如果您还需要提供帮助,请告诉我。

更新:

我忘记说了。我正在尝试在

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)
...

的数据
.net vb.net winforms datagridview
3个回答
4
投票

发现我做错了什么。基本上试试这个:

Public Structure Printer
    Property id As Integer
    Property name As String
    Property material As Enums.Materials
    Property outputFolder As String
End Structure

2
投票

绑定的字段必须是属性,而不是公共变量。例如,如果您将结构替换为以下内容,您将在网格中看到 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

0
投票

老狗学会新把戏。

这个答案已针对 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 仍拥有所有数据。我希望这有助于澄清任何将来尝试这样做的人。之前的一些回复已过时,我正在尝试更新大部分我认为有用的主题。

© www.soinside.com 2019 - 2024. All rights reserved.