我有一个DataGridView应用程序。我使用SQLite数据库并将其表作为DataSource设置为我的DataGridView:我使用SQLiteDataAdapter获取DataSet并将其设置为DataSource:
grid.AutoGenerateColumns = false;
grid.DataSource = ds.Tables[0].DefaultView;
grid.Columns["criteriaId"].DataPropertyName = "rowid";
grid.Columns["criteriaName"].DataPropertyName = "name";
grid.Columns["criteriaDesc"].DataPropertyName = "description";
grid.Columns["criteriaDirection"].DataPropertyName = "direction";
到目前为止,一切似乎都在按照我的意愿行事。但是我想更新这个DataSource,用来自另一个源的另一个数据集中的其他数据替换所有行。所以我写道:
var originalDs = grid.DataSource as DataView;
var originalTable = originalDs.Table;
originalTable.Rows.Clear();
foreach (DataRow row in ds.Tables[0].Rows)
{
var newRow = originalTable.Rows.Add();
foreach (DataColumn column in ds.Tables[0].Columns)
{
object item = row[column];
var columnName = column.ColumnName;
if (originalTable.Columns[columnName] != null)
{
newRow[columnName] = item;
}
}
}
尽管如此,它按预期工作,我的DataGridView中的所有行都被新数据替换。但。现在我正在尝试使用这些更改来更新底层数据库,所以我正在调用:
var cmdb = new SQLiteCommandBuilder(adapter);
adapter.UpdateCommand = cmdb.GetUpdateCommand();
var cm = (CurrencyManager)grid.BindingContext[grid.DataSource, grid.DataMember];
cm.EndCurrentEdit();
grid.EndEdit();
adapter.Update(ds.Tables[0]);
其中,适配器是SQLiteDataAdapter,我曾经首先从DB读取数据。在这里,我遇到了一个问题:不是删除所有以前的数据并将新行保存到数据库,所有以前的记录仍然在我的数据库中,并且添加了来自新数据源的所有新行。所以它只是添加而不是替换行。在我调试的adapter.Update(ds.Tables[0]);
以上的行中,我可以看到ds.Tables [0]只有来自新源的行。那么为什么不删除旧行呢?我能做些什么才能让它发挥作用?
当我使用GUI手动删除DataGridView中的行,然后以相同的方式将其保存到数据库时,数据库中的Deletng行有效。
有什么想法吗?