【发布时间】:2015-07-22 13:44:18
【问题描述】:
我正在尝试将 DataGrid 中所做的更改反映到我的本地数据库(在本例中为 SQL Server Compact Edition),但它失败了。代码如下:
SqlCeConnection conn;
SqlCeDataAdapter dataAdapter;
public MainWindow()
{
InitializeComponent();
Init();
}
public void Init()
{
try
{
conn = new SqlCeConnection(@"Data Source = DataModel.sdf");
dataAdapter = new SqlCeDataAdapter("Select * from Members", conn);
SqlCeCommandBuilder commandBuilder = new SqlCeCommandBuilder(dataAdapter);
DataTable dataTable = new DataTable();
dataAdapter.Fill(dataTable);
dataTable.RowChanged += dataTable_RowChanged;
dataTable.RowDeleted += dataTable_RowDeleted;
membersDataGrid.ItemsSource = dataTable.DefaultView;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
void dataTable_RowDeleted(object sender, DataRowChangeEventArgs e)
{
dataAdapter.Update(sender as DataTable);
}
void dataTable_RowChanged(object sender, DataRowChangeEventArgs e)
{
dataAdapter.Update(sender as DataTable);
}
membersDataGrid 是 UI 中 DataGrid 视图的名称。我做错什么了吗? 在此先感谢:-)
【问题讨论】:
-
您将发送者作为参数传递给 dataAdapter.Update()
-
@jstreet 我已经检查了发件人。这是最新修改的表。应该作为新表存储在数据库中的那个。
-
通常您会为此目的使用事件参数 DataRowChangeEventArgs.Row。
-
哇...实际上它确实有效...我复制了您的代码,但只是使用常规 SQL Server(不是 CE)并且它确实有效,尽管我不会这样做。尝试在 Visual Studio 之外执行您的代码,否则您的数据库可能会在您的编译/执行周期中被覆盖,您将永远无法看到您的更改。我会发布对我有用的代码,也许它会对你有所帮助。
-
另外,请注意,当您从现有数据库添加数据源时,我使用的是 Visual Studio 为您创建的强类型数据集,这只是个人喜好。另一点:注意我在 table_RowChanged 事件处理程序中使用本地适配器,因为您的代码正在使用类实例变量。在这种情况下,更推荐使用本地适配器。