【问题标题】:C#: Fill DataGridView with DataTable creates empty tableC#:用 DataTable 填充 DataGridView 创建空表
【发布时间】:2017-01-30 10:59:25
【问题描述】:

我搜索了 Web 和 Stack Overflow,发现了很多关于如何用 DataTable 的内容填充 DataGridView 的描述。但它仍然对我不起作用。我的 DataGridView 显示了正确的列数和行数,但它们显示为空。

我使用以下方法:

public void ShowDataInGrid(ref DataTable table)
    {
        BindingSource sBind = new BindingSource();
        dbView.Columns.Clear();
        dbView.AutoGenerateColumns = false;
        sBind.DataSource = table;
        dbView.DataSource = sBind;    //Add table to DataGridView
        dbView.Columns.Add("Date", "Date");            
    }

在此之前,我通过设计器创建了一个名为“dbView”的 DataGridView。我什至不确定是否需要 sBind。如果没有它,我可以直接将表绑定到 dbView,但结果相同。

我怀疑我的桌子有问题。它起源于数据库 (SQLite),有几列和几行(其中一列的名称为“日期”)。它肯定充满了可读数据。 我主要使用以下命令读取表格(之后我通过几个不同的步骤操作数据,例如更改字符串和添加数字......):

        string sql = "select * from Bank";
        SQLiteCommand command = new SQLiteCommand(sql, m_dbConnection);
        SQLiteDataReader reader = command.ExecuteReader();
        table.Load(reader);
        reader.Close();
        table.AcceptChanges();

我认为问题可能在于,表条目存储为对象而不是字符串,因此无法显示。这就是为什么我试图通过对我的表进行以下更改来强制内容为字符串:

DataTable dbTableClone = new DataTable();
dbTableClone.Load(reader);
SQLiteDataReader reader.Close();
dbTableClone.AcceptChanges();

string[] dBHeader = new string[dbTableClone.Columns.Count];
dBHeader = ReadHeaderFromDataTable(dbTableClone); //own funktion, which reads the header
DataTable table;
table.Clear();
//will first create dbTable as empty clone, so I can set DataTyp of each Column
table = dbTableClone.Clone(); 
for (int col = 0; col > dBHeader.Length; col++) //first set all columns as string
{
   dbTable.Columns[col].DataType = typeof(string);
}
foreach (DataRow Row in dbTableClone.Rows)
{
   dbTable.ImportRow(Row);
}

这对我也没有帮助。 另一个想法:我在类似的问题上发现了一些 cmets,显然用引用解决了它:“我在 VS datagridview 设计器中设计了列。不是列名,但列 DataPropertyName 必须与数据库中的字段匹配。”不幸的是,我似乎无法做到/理解这一点。

下面是我输入表的一行。

【问题讨论】:

  • 你能简明扼要地定义你的问题吗?
  • DataViewTable 显示具有正确行数的表(与绑定表相同)但没有内容。每个单元格都是空的。
  • 执行完查询后你看到表有数据了吗?table.Load(reader);
  • 是的表肯定有数据。以下命令填充 singleRowContent: singleRowContent[row] = Convert.ToString(table.Rows[row][0]);但是我需要“转换”,否则我会收到错误:singleRowContent[row] = FDBHandler.dbable.Rows[row][0]; (不能将类型对象隐式转换为字符串)

标签: c# mysql datagridview


【解决方案1】:

尝试以这种方式获取并设置为 GridView

        SqlLiteConnection con = new SqlLiteConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=DB.mdf;Integrated Security=True");
        con.Open();
        SqlLiteDataAdapter adap = new SqlLiteDataAdapter("select * from Bank", con);
        DataSet ds = new System.Data.DataSet();
        adap.Fill(ds);
        dataGridView1.DataSource = ds.Tables[0];

评论你到目前为止所做的一切,试试这个,让我知道这是否适合你。根据您的数据库更改连接。

【讨论】:

  • 我用你的代码创建了一个新的 test()。我唯一需要改变的是 @"Data Source= test.sqlite ;AttachDbFilename=DB.mdf;Integrated Security=True"); --> ds 被填满(可以在调试模式下看到),但 dataGridView1 没有被填满(甚至没有空单元格)。 --> 我添加了 dataGridView1.Columns.Add("Date", "Date");这样我再次将单元格放入视图中,但它们仍然是空的。
  • 你能分享一下你的表的结构和数据吗?
  • 好的,我在原始帖子中添加了我的数据表一行的快照。
  • 问题是你的值不是获取和设置网格的代码。在设置网格的datasource 之前,您可能需要正确保存它们或正确获取它们。当您填写dataset 时,在其上创建for loop,获取所有列并查看它们的值并设置更正值,即将它们转换为您希望的任何格式,最后设置gridView1.datasource=ds
  • 非常感谢您的想法。我还怀疑数据表中的值是问题所在。我将再次仔细研究一下。 (我已经尝试将它们作为字符串转换为数据表)
【解决方案2】:

我解决了这个问题。 数据表很好。问题是我的 DataGridView dbView 的设置。我在设计器中设置了 dbView 并以某种方式给了它一个数据源。现在我将数据源设置为“无”(在“DataGridView 任务”中),我的数据按预期显示。 感谢 M Adeel Khalid 看我的东西。他向我保证我的链接代码是正确的,让我最终找到了解决方案。 最后我真的只需要使用一行:

dbView.DataSource = table;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多