我一直在与 NullReferenceException 作斗争,希望这里有人能够为我指明正确的方向。我正在尝试创建并填充 DataTable,然后在 DataGridView 控件中显示结果。基本代码如下,在我调用新的 UpdateResults_Delegate 时执行停止并出现 NullReferenceException。奇怪的是,我可以在从 QueryEventEntries 返回之前成功跟踪 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 响应而实现的。从那以后,我去掉了 Thread/Invoke;现在一切都发生在同一个执行线程上(谢谢,Sam)。
我正在尝试使用 DataTable 替换缓慢、笨拙的方法,我可以用 DataAdapter 填充它,并通过它的 DataSource 属性分配给 DataGridView(上面的代码已更新)。
在将其分配为 DataGridView 的数据源之前,我已经遍历了条目 DataTable 的行以验证该表是否包含预期的数据。
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 的设计 View 中预先指定的字段列表中。记录的值被填充到这些附加字段中。当运行时尝试呈现单元格时,会提供一个空值(因为完成了应该呈现的值,所以多了两列)。
鉴于此,我正在重新命名和重新标记问题。如果其他经历过这种情况的人可以指导我如何将 DataTable 绑定(bind)到 DataGridView 的现有列定义,我将不胜感激。
最佳答案
您需要确保每个列的 DataPropertyName
属性设置为 DataColumn
的 ColumnName
的相应名称。
您可能还需要将 DataGridView
的 AutoGenerateColumns
属性设置为 false
。
我找到了解决方案 here .
关于C# 将 DataTable 绑定(bind)到现有的 DataGridView 列定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2726616/