我想通过使用代码删除datagrid的记录并更新数据库。我使用以下代码从数据网格datagrid1.items.RemoveAt(0)
删除记录,和这一行给出一个错误消息:
当itemssource被使用时
操作无效
但是如果我用键盘删除键删除datagrid的记录,然后按btnUpdate_Click
键更新数据库,那么它就可以正常工作,没有错误。
所以请告诉我为什么会发生这种情况。我希望你们都能理解我的问题。我的所有代码在这里:
Dim db As New dbconnect()
Dim cmd As MySqlCommand
Dim cmdBuild As MySqlCommandBuilder
Dim da As MySqlDataAdapter
Dim dt As New DataTable
Private Sub btn_DayBook_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btn_DayBook.Click
cmd = New MySqlCommand("select * from transactions", db.conn)
dt = New DataTable()
da = New MySqlDataAdapter(cmd)
da.Fill(dt)
DataGrid1.DataContext = dt
DataGrid1.ItemsSource = dt.DefaultView
cmdBuild = New MySqlCommandBuilder(da)
End Sub
Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnUpdate.Click
Try
cmdBuild.GetUpdateCommand()
da.Update(dt)
btn_DayBook_Click(sender, e)
MsgBox("Record Updated")
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnDelete.Click
Try
DataGrid1.Items.RemoveAt(DataGrid1.SelectedIndex)
DataGrid1.Items.Refresh()
Catch ex As Exception
MsgBox(ex.ToString)
End Try
Try
cmdBuild.GetDeleteCommand()
da.Update(dt)
MsgBox("Record Deleted")
Catch ex As Exception
MsgBox(ex.ToString)
End Try
btn_DayBook_Click(sender, e)
End Sub
在WPF中,集合控件提供了设置或访问数据的两种主要方法。设置数据时,可以使用ItemsSource
属性,也可以使用的Items
属性。如果您使用ItemsSource
属性,那么要操作集合控件中的项,只需操作数据集合中的项,该数据集合是绑定到该控件的。
在您的示例中,您可以维护对DataTable
的引用并更改其行和列以更新UI。但是,当以这种方式编辑数据时,您需要一种在UI中更新更改的方法。因此,我们通常创建自定义类来表示我们的数据并实现INotifyPropertyChanged
接口。
然后我们将逐行迭代传入的数据,用数据填充ObservableCollection<YourDataType>
。这将被数据绑定到集合控件的ItemsSource
属性,然后可以通过编辑数据绑定集合中的项来进行更改。使用此方法通常与将itemsControl.SelectedItem
属性绑定到视图模型或代码中的YourDataType
类型的对象相结合。这是在WPF中使用集合控件的首选方式。
如果在绑定和mvvm中使用更多的WPF会更容易
- 你将有一个集合(最多是你的数据类型的OberservableCollection)
- 你可以将这个集合作为ItemsSource绑定到你的数据网格
- 你只是改变你的收集Clear(), Add(), Remove()和你的网格是"神奇地"显示这个:)
如果您将一个itemsource附加到数据网格,那么您需要修改作为itemsource的集合,而不是以您上面所做的方式。
当您按下键盘上的delete键时,datagrid正在为您处理此操作,并从itemsource中删除项目,而不是从datagrid中删除项目。