我想通过使用代码删除datagrid的记录并更新数据库。
我使用以下代码从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
答案 0 :(得分:1)
在WPF中,集合控件提供了两种设置或访问数据的主要方法。设置数据时,您可以使用ItemsSource
属性或来使用Items
属性。如果您使用ItemsSource
属性,那么要操作集合控件中的项目,只需操作数据集合中与该控件绑定的数据的项目。
在您的情况下,您可以维护对DataTable
的引用并更改其行和列以更新UI。但是,以这种方式编辑数据时,您需要一种在UI中更新更改的方法。因此,我们通常会创建代表我们数据的自定义类并实现INotifyPropertyChanged
Interface。
然后我们将逐行遍历输入的数据,用数据填充ObservableCollection<YourDataType>
。然后,这将是绑定到集合控件的ItemsSource
属性的数据,然后可以通过编辑数据绑定集合中的项来进行更改。使用此方法通常与将itemsControl.SelectedItem
属性绑定到视图模型中的YourDataType
类型的对象或后面的代码的数据相结合。这是在WPF中使用集合控件的首选方法。
答案 1 :(得分:0)
如果使用绑定和mvvm进行更多wpf会更容易
答案 2 :(得分:0)
如果您将一个itemsource附加到datagrid,那么您需要修改您用作itemource的集合,而不是像上面那样。
当你在键盘上按下delete时,datagrid会为你处理这个并删除itemsource而不是datagrids项目中的项目。