如果为空,则在 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();
}
以下是我能想到的几个选项。
即使没有返回记录,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");
}
您可以实例化一个新的 DataTable
,并在其中添加您想要的列,然后使用它。我真的不认为这有什么意义,但这是一个选择。
if (datset2.Rows.Count == 0)
{
datset2 = new DataTable();
datset2.Columns.Add("Message", typeof(string));
datset2.Rows.Add("No items found");
}
您可以将 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;
如何告诉 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();
}
以下是我能想到的几个选项。
即使没有返回记录,
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"); }
您可以实例化一个新的
DataTable
,并在其中添加您想要的列,然后使用它。我真的不认为这有什么意义,但这是一个选择。if (datset2.Rows.Count == 0) { datset2 = new DataTable(); datset2.Columns.Add("Message", typeof(string)); datset2.Rows.Add("No items found"); }
您可以将
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;