代码之家  ›  专栏  ›  技术社区  ›  Timothy

将数据表绑定到现有的DataGridView列定义

  •  12
  • Timothy  · 技术社区  · 16 年前

    我一直在和一个空引用异常作斗争,希望这里的人能够把我指向正确的方向。我正在尝试创建和填充数据表,然后在DataGridView控件中显示结果。下面是基本代码,在我调用新的updateResults_委托时,执行将以nullReferenceException停止。奇怪的是,在从QueryEventEntries返回entries.rows.count之前,我可以成功跟踪entries.rows.count,因此我至少可以显示1)entries不是空引用,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的响应。我已经剥离了线程/调用;现在一切都发生在同一个执行线程上(谢谢, Sam )

    我正试图用一个DataTable来替换这种缓慢、笨拙的方法,我可以用一个DataAdapter来填充它,并通过它的DataSource属性(上面的代码已更新)分配给DataGridView。

    在将表指定为DataGridView的数据源之前,我已经对数据表的行进行了迭代,以验证该表是否包含预期的数据。

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

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

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

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

    2 回复  |  直到 13 年前
        1
  •  26
  •   RLH    13 年前

    您需要确保每个列的 DataPropertyName 属性设置为 DataColumn ColumnName .

    您可能还需要设置 DataGridView AutoGenerateColumns 属性到 false .

    我找到了解决办法 here .

        2
  •  0
  •   Samuel Neff    16 年前

    如果错误发生在 UpdateResults 那听起来像 dataGridView 是空的。

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