当itemssource正在使用时,数据网格操作无效



我想通过使用代码删除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中删除项目。

最新更新