当itemssource正在使用时,Datagrid操作无效

时间:2014-03-28 09:52:31

标签: wpf vb.net datagrid

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

3 个答案:

答案 0 :(得分:1)

在WPF中,集合控件提供了两种设置或访问数据的主要方法。设置数据时,您可以使用ItemsSource属性来使用Items属性。如果您使用ItemsSource属性,那么要操作集合控件中的项目,只需操作数据集合中与该控件绑定的数据的项目。

在您的情况下,您可以维护对DataTable的引用并更改其行和列以更新UI。但是,以这种方式编辑数据时,您需要一种在UI中更新更改的方法。因此,我们通常会创建代表我们数据的自定义类并实现INotifyPropertyChanged Interface

然后我们将逐行遍历输入的数据,用数据填充ObservableCollection<YourDataType>。然后,这将是绑定到集合控件的ItemsSource属性的数据,然后可以通过编辑数据绑定集合中的项来进行更改。使用此方法通常与将itemsControl.SelectedItem属性绑定到视图模型中的YourDataType类型的对象或后面的代码的数据相结合。这是在WPF中使用集合控件的首选方法。

答案 1 :(得分:0)

如果使用绑定和mvvm进行更多wpf会更容易

  • 你会有一个集合(最好是你的数据类型的OberservableCollection)
  • 您将此集合作为ItemsSource绑定到您的datagrid
  • 您只需使用Clear(),Add(),Remove()更改您的收藏,并且您的网格“神奇地”显示:)

答案 2 :(得分:0)

如果您将一个itemsource附加到datagrid,那么您需要修改您用作itemource的集合,而不是像上面那样。

当你在键盘上按下delete时,datagrid会为你处理这个并删除itemsource而不是datagrids项目中的项目。