Абсолютно нет проблем с привязкой таблицы данных с нулевыми строками - она будет иметь набор столбцов правильных типов независимо и будет автоматически создавать столбцы, если свойство AutoGenerateColumns имеет значение true
Проблемы возникают просто потому, что вы ' мы пытаемся получить доступ к ячейке таблицы данных на 0,0, не убедившись, что она существует, поэтому вы можете поставить:
dgvCategories.DataSource = this.dtCategories;
dgvCategories.Columns[0].Visible = false;
it(dtCategories.Rows.Count > 0)
dgvCategories.Rows[0].Cells[0].Selected = false;
Но вам нужно просто взять эту строку полностью - это ничего не делает в любом случае; он не скрывает синюю подсветку выделения в верхнем левом углу, а верхняя левая ячейка вновь связанного представления данных уже Selected=false
, поэтому вы не получите ничего, кроме исключения, с этой строкой кода
Если вы хотите скрыть синюю выделенную область, когда DGV не сфокусирован, установите значение Style.SelectionBackColor
ячейки равным Style.BackColor
, но установите его что-то видимое, когда пользователь фокусирует сетку или ему будет трудно понять, почему он не может выделить эту ячейку.
Если вы хотите удалить строку-призрак, которая позволяет добавлять новые значения, установите для AllowUserToAddRows
значение false
Если вы хотите, чтобы пользователь знал, что в недавнем поиске не было строк Поместите метку в верхней части DGV с надписью «Ваш поиск» независимо от того, что «результаты не дали результатов» и установите ее видимость в зависимости от наличия строк:
lblNoResults.Text = $"Your search '{categoryFilter}' returned no rows";
lblNoResults.Visible = dtCategories.Rows.Count == 0;
Наконец, вам не нужно использовать DataSet, когда все, что вам нужно, это DataTable. Адаптер данных может заполнить таблицу данных; go не нужно тратить дополнительные усилия на использование набора данных - это все равно, что использовать List<string>
и обращаться к его 0-му элементу, когда все, что вам нужно - это string
. Вам также не нужно открывать / закрывать соединение - dataadapter знает, как сделать это самому. Он достаточно умен, чтобы не закрывать открытое в другом месте соединение (в случае, если транзакция выполняется):
DataTable dt = new DataTale();
using (NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd))
{
da.Fill(dt);
}
return dt;