我有DataGridView填充了来自datasource(SQL)的数据。现在我想添加一个新行,但我不能,因为新数据无法添加到有界DataGridView ...
我试图:
dataGridView1.Source = null;
dataGridView1.Rows.Add("1");
但它清除了我之前在表格中的数据。怎么做,添加新行而不删除以前的数据?
答案 0 :(得分:6)
当您将DataSource
property设置为null
时,您实际上是从DataGridView
中移除所有数据(因为它不知道要绑定到什么内容)了)。
这里有两种选择。第一种是更新基础数据源。我们假设它是DataTable
。在这种情况下,您可以执行以下操作:
DataTable dt = dataGridView1.Source as DataTable;
dt.Rows.Add(new object[] { ... });
然后DataGridView
会接受更改(请注意,如果您没有绑定到未实现INotifyCollectionChanged
interface的内容,则必须调用ResetBindings
method让网格刷新)。
另一个选择是让DataGridView
管理行。您可以使用Add
method返回的DataGridViewRowCollection
上的Rows
property手动添加每个项目来执行此操作:
foreach (var item in source)
{
dataGridView1.Rows.Add("1", "2", "3", ...);
}
我不会说第二个解决方案是最优,但它会起作用。
最后,假设您绑定到DataTable
(或来自基础数据源的数据的其他一些实现),这对更新底层数据源没有任何作用(这将是一个单独的问题)。
答案 1 :(得分:1)
简短的回答是,你没有。
当您将DataSource
设置为null时,您已断开DataGridView
与数据源之间的链接,因此其数据将不会保留。您不能向绑定DataGridView
添加行,因为它应该表示基础DataSource
的状态;你有效地要求.net使你的表与它的后备存储不同步,首先就是打败了数据绑定的目的。
如果要在后备存储中添加行,则应在DataSource
中添加一行,而不是在DataGridView
中添加。
答案 2 :(得分:0)
也许你想手动和详细地做?像这样的东西?
DataSet ds = new DataSet();
OleDbDataAdapter adapter = null;
adapter = new OleDbDataAdapter("SELECT * FROM WHERE", conn);
adapter.Fill(ds);
dataGridView1.ColumnCount = 5; //how many columns returns your SQL query? starts with 0
dataGridView1.Columns[0].Name = "COl-1";
dataGridView1.Columns[1].Name = "COl-2";
dataGridView1.Columns[2].Name = "COl-3";
dataGridView1.Columns[3].Name = "COl-4";
dataGridView1.Columns[4].Name = "COl-5";
DataTable dt = ds.Tables[0];
foreach (DataRow dr in dt.Rows)
{
dataGridView1.Rows.Add(
(dr["COL_HEADER_NAME1"].ToString()),
(dr["COL_HEADER_NAME2"].ToString()),
(dr["COL_HEADER_NAME3"].ToString()),
(dr["COL_HEADER_NAME4"].ToString()),
(dr["COL_HEADER_NAME5"].ToString()));
}
答案 3 :(得分:0)
您只需使用行集合的添加方法
添加行me.datagridview1.rows.add("first","second","third");
您可以使用数组集合添加任意数量的项目。