我一直在努力处理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的现有列定义,我仍然会很感激.
您需要确保每个列的DataPropertyName
属性设置为相应名称DataColumn
的ColumnName
.
您可能还需要将DataGridView
's AutoGenerateColumns
属性设置为false
.
我在这里找到了解决方案.