C#将DataTable绑定到现有的DataGridView列定义

时间:2010-04-28 03:22:11

标签: c# datagridview datatable winforms

我一直在努力解决NullReferenceException,并希望有人能指出我正确的方向。我正在尝试创建并填充DataTable,然后在DataGridView控件中显示结果。接下来是基本代码,Execution在我调用新的UpdateResults_Delegate时停止并显示NullReferenceException。奇怪的是,我可以在从QueryEventEntries返回之前成功跟踪entries.Rows.Count,因此我至少可以显示1)条目不是空引用,2)DataTable包含数据行。我知道我必须做错事,但我不知道是什么。

private void UpdateResults(DataTable entries)
{
    dataGridView.DataSource = entries;
}

private void button_Click(object sender, EventArgs e)
{
    PerformQuery();
}

private void PerformQuery()
{
    DateTime start = new DateTime(dateTimePicker1.Value.Year,
                                  dateTimePicker1.Value.Month,
                                  dateTimePicker1.Value.Day,
                                  0, 0, 0);

    DateTime stop  = new DateTime(dateTimePicker2.Value.Year,
                                  dateTimePicker2.Value.Month,
                                  dateTimePicker2.Value.Day,
                                  0, 0, 0);

    DataTable entries = QueryEventEntries(start, stop);
    UpdateResults(entries);
}

private DataTable QueryEventEntries(DateTime start, DateTime stop)
{
    DataTable entries = new DataTable();
    entries.Columns.AddRange(new DataColumn[] {
        new DataColumn("event_type", typeof(Int32)),
        new DataColumn("event_time", typeof(DateTime)),
        new DataColumn("event_detail", typeof(String))});

    using (SqlConnection conn = new SqlConnection(DSN))
    {
        using (SqlDataAdapter adapter = new SqlDataAdapter(
            "SELECT event_type, event_time, event_detail FROM event_log " +
            "WHERE event_time >= @start AND event_time <= @stop",
            conn))
        {
            adapter.SelectCommand.Parameters.AddRange(new Object[] {
                new SqlParameter("@start", start),
                new SqlParameter("@stop", stop)});
            adapter.Fill(entries);
        }
    }
    return entries;
}

更新

我想总结并提供一些我从此处的讨论中学到的更多信息以及自我最初发布此问题以来的调试工作。

我正在重构从数据库中检索记录的旧代码,将这些记录收集为数组,然后迭代遍历数组以逐行填充DataGridView。线程最初是为了在不必要的循环期间补偿并保持UI响应而实现的。我已经剥离了Thread / Invoke;现在一切都发生在同一个执行线程上(谢谢你,Sam)。

我正在尝试使用DataTable替换缓慢,笨拙的方法,我可以使用DataAdapter填充它,并通过它的DataSource属性(上面代码更新)分配给DataGridView。

我已经遍历条目DataTable的行来验证表包含预期数据,然后再将其指定为DataGridView的DataSource。

foreach (DataRow row in entries.Rows)
{
    System.Diagnostics.Trace.WriteLine(
        String.Format("{0} {1} {2}", row[0], row[1], row[2]));
}

DataGridView的一列是一个自定义DataGridViewColumn,用于样式化event_type值。我很抱歉我之前在原帖中没有提到这个,但我不知道这对我的问题很重要。我已暂时将此列转换为标准DataGridViewTextBoxColumn控件,并且不再遇到异常。

DataTable中的字段将附加到DataGridView的“设计”视图中预先指定的字段列表中。记录的值正在这些附加字段中填充。当运行时尝试渲染单元格时,提供了一个空值(因为应该渲染的值完成,所以几列完成)。

鉴于此,我正在重新标题并重新标记问题。如果其他经历过这种情况的人可以指导我如何将DataTable绑定到DataGridView的现有列定义,我仍然会很感激。

2 个答案:

答案 0 :(得分:27)

您需要确保每个列的DataPropertyName属性设置为DataColumn的{​​{1}}的相应名称。

您可能还需要将ColumnName的{​​{1}}媒体资源设为DataGridView

我找到了解决方案here

答案 1 :(得分:0)

如果UpdateResults内发生错误,则听起来dataGridView为空。

private void UpdateResults(DataTable entries)
{
    dataGridView.DataSource = entries; // when is dataGridView set?
}
相关问题