Я боролся с NullReferenceException и надеюсь, что кто-то здесь сможет указать на меня в правильном направлении. Я пытаюсь создать и заполнить DataTable и затем показать результаты в управлении DataGridView. Абсолютный код следует, и остановки Выполнения с NullReferenceException в точке, где я вызываю новый UpdateResults_Delegate. Достаточно странно я могу проследить записи. Строки. Рассчитайте успешно, прежде чем я возвращу его из QueryEventEntries, таким образом, я могу, по крайней мере, показать 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 быстро реагирующим во время ненужного цикличного выполнения. Я с тех пор разделил, Распараллеливают/Вызывают; все теперь происходит на том же потоке выполнения (спасибо, Sam).
Я пытаюсь заменить медленный, громоздкий подход с помощью DataTable, который я могу заполнить DataAdapter, и присваивать DataGridView через, это - свойство DataSource (выше обновленного кода).
Я выполнил итерации через строки DataTable записей, чтобы проверить, что таблица содержит ожидаемые данные прежде, чем назначить его DataSource DataGridView.
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
.
Вам также может потребоваться установить для свойства AutoGenerateColumns
свойства DataGridView
значение false
.
Я нашел решение здесь .
Если ошибка возникает внутри UpdateResults
, то похоже, что dataGridView
имеет значение NULL.
private void UpdateResults(DataTable entries)
{
dataGridView.DataSource = entries; // when is dataGridView set?
}