如果为空,则在 DataGridView 中显示临时 "No items found" 行

Show temporary "No items found" row in DataGridView if empty

如何告诉 DataGridView 如果它是空的,它应该自动在里面临时添加一个新行,它的值应该是 "No items found"?

使用消息框可以轻松解决这个问题,但我不喜欢这种方法。

这是我的代码

using (MySqlConnection conn = new MySqlConnection(myConnection))
{
    string cell = dataGridView3.CurrentCell.Value.ToString();
    conn.Open();
    string query = "SELECT product_item FROM dequor.prods2,dequor.prods where prods.idprods = prods2.prods_idprods and prod_brand=?para";
    using (MySqlCommand cmd = new MySqlCommand(query, conn))
    {
        cmd.Parameters.AddWithValue("?para", cell);
        try
        {
            sda2 = new MySqlDataAdapter();
            sda2.SelectCommand = cmd;
            datset2 = new DataTable();
            sda2.Fill(datset2);
            bsource2 = new BindingSource();


            bsource2.DataSource = datset2;
            dataGridView2.DataSource = bsource2;
            DataGridViewColumn column = dataGridView2.Columns[0];
            column.Width = 125;
            sda2.Update(datset2);

            if (dataGridView2.RowCount < 1)
            {
                datset2.Clear();
                string row = "NO items found";
                dataGridView2.Rows.Add(row);
             //////got an error here
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("" + ex);
        }
    }
    conn.Close();
}

以下是我能想到的几个选项。

  1. 即使没有返回记录,datset2 在执行查询后仍然应该有一个名为 "product_item" 的列,因此您可以重新使用它。

    datset2 = new DataTable();
    sda2.Fill(datset2);
    
    if (datset2.Rows.Count == 0)
    {
        // I'm assuming "product_item" is a string
        datset2.Rows.Add("No items found");
    }
    
  2. 您可以实例化一个新的 DataTable,并在其中添加您想要的列,然后使用它。我真的不认为这有什么意义,但这是一个选择。

    if (datset2.Rows.Count == 0)
    {
        datset2 = new DataTable();
        datset2.Columns.Add("Message", typeof(string));
        datset2.Rows.Add("No items found");
    }
    
  3. 您可以将 Label 添加到您的 Form,将其放置在 DataGridView 之上,并在需要时隐藏它。

    labelNoDataMessage.Text = "No items found";
    
    if (datset2.Rows.Count == 0)
    {
        labelNoDataMessage.Show();
    }
    

某些第三方控件可能具有支持此功能的内置功能,例如 Telerik 的 RadGridView 及其 ShowNoDataText 属性。但是,默认 DataGridView 没有这样的 属性。

改编自 Grant Winney 的答案我最终使用了这个

 var dataTable = new DataTable();
 dataTable.Columns.Add("Message", typeof(string));
 dataTable.Rows.Add("No items found");

 myDataGridView.DataSource = new BindingSource { DataSource = dataTable };
 myDataGridView.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;