winforms 设置Datasheet后,DataGridView为空

mepcadol  于 8个月前  发布在  其他
关注(0)|答案(3)|浏览(58)

我看了一下,发现一个问题是类似的,但没有解决我的问题-另一个问题是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)的数据。

pbgvytdp

pbgvytdp1#

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

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

k2fxgqgv2#

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

z9smfwbn3#

这个答案是为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完成了他(她?)任务,在RunWorkerCompleted上,我将DataGridView的DataSource设置为BindingSource,然后重置绑定以刷新:

grid_Names.DataSource = bs_Famous
bs_Famous.ResetBindings(True)

就是这样DataViewGrid拥有所有数据,即使我在Designer中设置了大部分控件。我希望这有助于澄清任何人试图在未来这样做。以前的一些回复已经过时了,我正在努力更新我认为有用的大部分主题。

相关问题