Как обрабатывать ноль строк, возвращаемых при привязке данных к DataGridView - PullRequest
0 голосов
/ 01 апреля 2020

Я заполняю DGV данными из базы данных, и все работает отлично, за исключением случаев, когда 0 строк возвращаются в DataTable, который заполняет DGV. И я не уверен, как именно справиться с этой ситуацией, которую мне нужно учитывать из-за требований программы.

Вот код формы, который вызывает метод привязки данных:

public void PopulateDgvCategories()
{
    string companyFilter = cboSelectCompany.Text;
    string categoryFilter = cboSelectCategory.Text;

    db categoriesData = new db();

    if (categoryFilter == "All Categories")
    {
        string catsQuery = "SELECT id, category, old_value, old_desc, new_value, new_desc, reference1, reference2 " +
                            "FROM masterfiles.xref WHERE company_name = @company ORDER BY category, old_value";
           this.dtCategories = categoriesData.GetDgvData(catsQuery, companyFilter, categoryFilter);
    }
    else
    {
        string catsQuery = "SELECT id, category, old_value, old_desc, new_value, new_desc, reference1, reference2 " +
                            "FROM masterfiles.xref WHERE company_name = @company and category = @category ORDER BY old_value";
        this.dtCategories = categoriesData.GetDgvData(catsQuery, companyFilter, categoryFilter);
    }

    // Need to check this.dtCategories.Rows.Count
    //  If 0, then need to figure out how to handle that

    dgvCategories.DataSource = this.dtCategories;

    dgvCategories.Columns[0].Visible = false;
    dgvCategories.Rows[0].Cells[0].Selected = false;
}

А вот как я извлекаю данные и заполняю DataTable:

public DataTable GetDgvData(string selectQuery, string companyFilter, string categoryFilter)
{
    using (NpgsqlConnection conn = new NpgsqlConnection(connString))
    using (NpgsqlCommand cmd = new NpgsqlCommand(selectQuery, conn))
    {
        cmd.Parameters.Add(new NpgsqlParameter("company", companyFilter));
        if (categoryFilter != "All Categories") cmd.Parameters.Add(new NpgsqlParameter("category", categoryFilter));

        DataSet ds = new DataSet();

        conn.Open();

        using (NpgsqlDataAdapter da = new NpgsqlDataAdapter(cmd))
        {
            da.Fill(ds);
        }
        conn.Close();

        return ds.Tables[0];
    }
}

Возможно, переменная categoryFilter может заставить запрос вернуть 0 строк.

Что лучший способ справиться с этим? Я думаю, вручную создать DGV только с строкой заголовка (имена столбцов) и отобразить MessageBox, говоря, что строки не были возвращены. Это возможно / выполнимо и будет ли это лучшим способом справиться с этим?

1 Ответ

1 голос
/ 04 апреля 2020

Абсолютно нет проблем с привязкой таблицы данных с нулевыми строками - она ​​будет иметь набор столбцов правильных типов независимо и будет автоматически создавать столбцы, если свойство 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, поэтому вы не получите ничего, кроме исключения, с этой строкой кода

enter image description here

Если вы хотите скрыть синюю выделенную область, когда 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;
...