【问题标题】:Datagrid operation is not valid while itemssource is in use使用 itemssource 时 Datagrid 操作无效
【发布时间】:2014-05-07 16:58:24
【问题描述】:

我想通过代码删除datagrid的记录并更新数据库。 我使用以下代码从数据网格datagrid1.items.RemoveAt(0) 中删除记录, 这行给出了一个错误消息:

在使用 itemssource 时操作无效

但是如果我使用键盘删除按钮删除数据网格的记录,然后按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 vb.net datagrid


    【解决方案1】:

    如果使用绑定和 mvvm 做更多的 wpf 会更容易

    • 您将拥有一个集合(最好是您的数据类型的 OberservableCollection)
    • 您可以将此集合作为 ItemsSource 绑定到您的数据网格
    • 您只需使用 Clear()、Add()、Remove() 更改您的集合,您的网格就会“神奇地”显示这个 :)

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        如果您将 itemsource 附加到数据网格,那么您需要修改您用作 itemsource 的集合,而不是按照您上面所做的方式。

        当您按键盘上的删除键时,数据网格会为您处理此问题,并从您的项目源中删除项目而不是数据网格项目。

        【讨论】:

          猜你喜欢
          • 2018-09-22
          • 1970-01-01
          • 1970-01-01
          • 2016-03-26
          • 1970-01-01
          • 2012-06-20
          • 1970-01-01
          • 2016-02-26
          • 1970-01-01
          相关资源
          最近更新 更多