C# связывают DataTable с существующими определениями столбца DataGridView

Я боролся с 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.

13
задан Community 23 May 2017 в 12:17
поделиться

2 ответа

Убедитесь, что для свойства DataPropertyName каждого столбца установлено соответствующее имя DataColumn ColumnName .

Вам также может потребоваться установить для свойства AutoGenerateColumns свойства DataGridView значение false .

Я нашел решение здесь .

27
ответ дан 1 December 2019 в 21:11
поделиться

Если ошибка возникает внутри UpdateResults , то похоже, что dataGridView имеет значение NULL.

private void UpdateResults(DataTable entries)
{
    dataGridView.DataSource = entries; // when is dataGridView set?
}
0
ответ дан 1 December 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: