WPF DataGrid 删除的行不会在数据库中更新(删除)
WPF DataGrid deleted rows don't get updated (deleted) in the database
我的应用中有一个DataGrid
,其XML定义如下:
<DataGrid x:Name="grid"
DockPanel.Dock="Top"
Visibility="{Binding gridVisibility}"
CellStyle="{StaticResource ValidationReadyCellStyle}"
IsSynchronizedWithCurrentItem="True"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch"
ColumnWidth="*"
ItemsSource="{Binding DBtable, ValidatesOnExceptions=False,
NotifyOnSourceUpdated=True, TargetNullValue={x:Static system:String.Empty}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
AutoGenerateColumns="True" AutoGeneratingColumn="grid_OnAutoGeneratingColumn" CanUserAddRows="True"
BeginningEdit="grid_OnBeginningEdit" PreviewKeyDown="grid_OnPreviewKeyDown" RowEditEnding="grid_OnRowEditEnding" CellEditEnding="grid_OnCellEditEnding">
<DataGrid.RowValidationRules>
<local:RowValidationChecker ValidationStep="UpdatedValue"/>
</DataGrid.RowValidationRules>
</DataGrid>
可以看出,ItemsSource
绑定了一个名为DBtable
的table,根据它自动生成了rows/columns。以下是用于连接和更新数据库的代码片段:
public bool SaveToDB(DataTable table, string tableName)
{
var msSqlConnectionClass = new MsSqlConnectionClass(MsSqlLogin.Default.Server,
MsSqlLogin.Default.LoremIpsumDB, MsSqlLogin.Default.UID,
MsSqlLogin.Default.Password, MsSqlLogin.Default.WinAuth);
SqlConnection msSqlConnection = msSqlConnectionClass.getMsSqlConnection();
msSqlConnection.Open();
try
{
string strSQL = "SELECT * FROM " + tableName;
SqlDataAdapter da = new SqlDataAdapter(strSQL, msSqlConnection);
SqlCommandBuilder command = new SqlCommandBuilder(da);
da.UpdateCommand = command.GetUpdateCommand();
da.DeleteCommand = command.GetDeleteCommand();
da.InsertCommand = command.GetInsertCommand();
da.Update(table);
msSqlConnection.Close();
}
catch (Exception e)
{
ServiceLog.AddLogInfo(e.ToString());
msSqlConnection.Close();
return false;
}
return true;
}
问题是,尽管在 DataGrid
中完成的任何添加或编辑操作都在数据库中得到完美更新,但不幸的是,我无法实现相同的删除操作行为。删除是在源本身中完成的,所以当我在删除操作后检查行数时(我使用 DBtable.Rows.RemoveAt()
),DBtable
显示该行已被删除,但更改没有在使用上面显示的 SaveToDB()
函数进行更新尝试后反映在数据库中。我该怎么办?
我发现了问题。显然
Dbtable.Rows.RemoveAt(selectedIndex);
不让数据table知道删除命令已经发出。因此,当对数据库执行 运行 更新命令时,不会看到也不会执行任何删除操作。相反,使用
row = DBtable.Rows[selectedIndex];
row.Delete();
解决了问题。
类似的事情也让我很困惑。对于以后搜索时可能遇到此页面的人,这里有一个解决方案。
public DataTable GetMembers()
{
conn = new SqlCeConnection(@"Data Source = DataModel.sdf");
dataAdapter = new SqlCeDataAdapter("Select * from Members", conn);
commandBuilder = new SqlCeCommandBuilder(dataAdapter);
dataTable = new DataTable();
dataAdapter.Fill(dataTable);
dataTable.RowChanged += new DataRowChangeEventHandler(dataTable_RowChanged);
dataTable.RowDeleted += new DataRowChangeEventHandler(dataTable_RowDeleted);
dataTable.DefaultView.ListChanged += DefaultView_ListChanged;
return dataTable;
}
void DefaultView_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e)
{
if (e.ListChangedType == System.ComponentModel.ListChangedType.ItemDeleted)
{
try
{
dataAdapter.Update(dataTable);
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.Message);
}
}
}
我的应用中有一个DataGrid
,其XML定义如下:
<DataGrid x:Name="grid"
DockPanel.Dock="Top"
Visibility="{Binding gridVisibility}"
CellStyle="{StaticResource ValidationReadyCellStyle}"
IsSynchronizedWithCurrentItem="True"
HorizontalAlignment="Stretch"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Stretch"
ColumnWidth="*"
ItemsSource="{Binding DBtable, ValidatesOnExceptions=False,
NotifyOnSourceUpdated=True, TargetNullValue={x:Static system:String.Empty}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
AutoGenerateColumns="True" AutoGeneratingColumn="grid_OnAutoGeneratingColumn" CanUserAddRows="True"
BeginningEdit="grid_OnBeginningEdit" PreviewKeyDown="grid_OnPreviewKeyDown" RowEditEnding="grid_OnRowEditEnding" CellEditEnding="grid_OnCellEditEnding">
<DataGrid.RowValidationRules>
<local:RowValidationChecker ValidationStep="UpdatedValue"/>
</DataGrid.RowValidationRules>
</DataGrid>
可以看出,ItemsSource
绑定了一个名为DBtable
的table,根据它自动生成了rows/columns。以下是用于连接和更新数据库的代码片段:
public bool SaveToDB(DataTable table, string tableName)
{
var msSqlConnectionClass = new MsSqlConnectionClass(MsSqlLogin.Default.Server,
MsSqlLogin.Default.LoremIpsumDB, MsSqlLogin.Default.UID,
MsSqlLogin.Default.Password, MsSqlLogin.Default.WinAuth);
SqlConnection msSqlConnection = msSqlConnectionClass.getMsSqlConnection();
msSqlConnection.Open();
try
{
string strSQL = "SELECT * FROM " + tableName;
SqlDataAdapter da = new SqlDataAdapter(strSQL, msSqlConnection);
SqlCommandBuilder command = new SqlCommandBuilder(da);
da.UpdateCommand = command.GetUpdateCommand();
da.DeleteCommand = command.GetDeleteCommand();
da.InsertCommand = command.GetInsertCommand();
da.Update(table);
msSqlConnection.Close();
}
catch (Exception e)
{
ServiceLog.AddLogInfo(e.ToString());
msSqlConnection.Close();
return false;
}
return true;
}
问题是,尽管在 DataGrid
中完成的任何添加或编辑操作都在数据库中得到完美更新,但不幸的是,我无法实现相同的删除操作行为。删除是在源本身中完成的,所以当我在删除操作后检查行数时(我使用 DBtable.Rows.RemoveAt()
),DBtable
显示该行已被删除,但更改没有在使用上面显示的 SaveToDB()
函数进行更新尝试后反映在数据库中。我该怎么办?
我发现了问题。显然
Dbtable.Rows.RemoveAt(selectedIndex);
不让数据table知道删除命令已经发出。因此,当对数据库执行 运行 更新命令时,不会看到也不会执行任何删除操作。相反,使用
row = DBtable.Rows[selectedIndex];
row.Delete();
解决了问题。
类似的事情也让我很困惑。对于以后搜索时可能遇到此页面的人,这里有一个解决方案。
public DataTable GetMembers()
{
conn = new SqlCeConnection(@"Data Source = DataModel.sdf");
dataAdapter = new SqlCeDataAdapter("Select * from Members", conn);
commandBuilder = new SqlCeCommandBuilder(dataAdapter);
dataTable = new DataTable();
dataAdapter.Fill(dataTable);
dataTable.RowChanged += new DataRowChangeEventHandler(dataTable_RowChanged);
dataTable.RowDeleted += new DataRowChangeEventHandler(dataTable_RowDeleted);
dataTable.DefaultView.ListChanged += DefaultView_ListChanged;
return dataTable;
}
void DefaultView_ListChanged(object sender, System.ComponentModel.ListChangedEventArgs e)
{
if (e.ListChangedType == System.ComponentModel.ListChangedType.ItemDeleted)
{
try
{
dataAdapter.Update(dataTable);
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.Message);
}
}
}