【问题标题】:why does my datagridview not show any results?为什么我的 datagridview 不显示任何结果?
【发布时间】:2016-07-07 06:08:42
【问题描述】:

我是 vb.net 的新手,正在尝试在我的 datagridview 中显示来自 mysql 服务器的结果。谁能指出我的代码有什么问题?提前致谢。

为了安全起见,省略了我的连接字符串,但它确实可以连接。如果我在代码中设置断点,它确实会用正确的数据填充数据集

Dim con As New MySqlConnection("server=;user id=;password=;database=")
    con.Open()

    Dim adp As New MySqlDataAdapter("Select CONCAT(FirstName,' ',Surname) as Name, LeaveDaysAvailable as 'Leave Days Available' from leave_database.Employees;", con)

    Dim ds As New DataSet()
    adp.Fill(ds)

    dgvMain.DataSource = ds


    con.Close()

这就是结果。没有错误......

如果我在 mysql 工作台中运行相同的查询,这是结果

【问题讨论】:

    标签: mysql vb.net datagridview


    【解决方案1】:

    DataSet 不直接包含数据。它有一个Tables 集合,其中包含DataTable 对象,每个对象都包含数据。如果将DataSet 分配给DataGridViewDataSource 属性,则还需要设置DataMember 属性来告诉它从哪个DataTable 获取数据。

    问题是,您还没有命名您的DataTable,所以您没有任何东西可以分配给DataMember。这一行:

    adp.Fill(ds)
    

    实际上创建了一个DataTable,填充它并将其添加到Tables 集合中。虽然它没有名字,所以你没有名字可以将DataMember 设置为。您需要先命名DataTable,例如

    adp.Fill(ds, "MyDataTable")
    

    然后你可以设置DataMember:

    dgvMain.DataMember = "MyDataTable"
    dgvMain.DataSource = ds
    

    另一种方法是只绑定DataTable 而不是DataSet,在这种情况下您不需要名称:

    dgvMain.DataSource = ds.Tables(0)
    

    但问题是,如果您只想使用DataTable,为什么要首先创建DataSet?只需创建一个DataTable。然后,您可以将该 DataTable 传递给 Fill 调用并将其分配给 DataSource 属性。

    【讨论】:

    • 好的,谢谢 :) 我现在明白那部分了,但是我将如何定义它呢?我知道您可以使用组合框设置值和显示成员,但是如何设置 dgv 中的列?
    • cool :) 如果我想采用数据表的方式,我会写什么?
    • 感谢您的帮助。 dgvMain.DataSource = ds.Tables(0) 工作:) 我离开了 dataGridView1.AutoGenerateColumns = true;在以及:)
    • “如果我想采用数据表的方式,我会写什么”。不要等待代码复制和粘贴,而是阅读说明并实施它们。那里没有什么难的。实际上,您只需要更改原始代码中的一项工作,尽管您可能也应该更改变量名。
    【解决方案2】:

    dataGridView1.AutoGenerateColumns = true;

    否则,您必须向数据网格添加列,您可以使用设计器文件或类似代码的代码来完成

    DataGridTextColumn textColumn = new DataGridTextColumn(); 
    dataColumn.Header = "First Name"; 
    dataColumn.Binding = new Binding("Name"); 
    dataGrid.Columns.Add(textColumn); 
    
    DataGridTextColumn textColumn = new DataGridTextColumn(); 
    dataColumn.Header = "Leave day available"; 
    dataColumn.Binding = new Binding("LeaveDaysAvailable"); 
    dataGrid.Columns.Add(textColumn);
    

    使用设计师这可能会帮助你https://msdn.microsoft.com/en-us/library/dyyesckz(v=vs.100).aspx

    【讨论】:

    • 无需自己添加列。如果您正确绑定,它们将在您绑定时默认自动添加。如果您想在设计时绑定或者您想要默认列以外的其他列,则只需要自己添加列,例如你想要组合框列。
    • 或者你需要dataGridView1.AutoGenerateColumns = true;
    • dgvMain.AutoGenerateColumns = True 没有任何不同。当我运行时仍然没有结果
    • 感谢您的帮助,但我已经在 sql 查询中做了特殊的串联列名。所以一直在寻找一种动态的方式来做到这一点
    • AutoGenerateColumns 默认为True,因此无需设置。绑定时,将自动为数据源的每个列/属性创建一个列,除非已经存在具有适当DataPropertyName 值的列。顺便说一句,您的原始代码看起来是针对DataGrid 而不是DataGridView,否则它实际上对任何类型的网格都无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2021-12-21
    • 2016-05-07
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 2018-04-25
    相关资源
    最近更新 更多