【问题标题】:Windows Forms App Basics: Deleting a row from a bound DataGridViewWindows 窗体应用基础:从绑定的 DataGridView 中删除一行
【发布时间】:2014-08-26 19:46:26
【问题描述】:

我在 WinForms 应用程序上有一个 DataGridView 控件,该控件是从我的数据库中的一个表绑定的。每当用户从 DataGridView 将一行“拉”到位于它旁边的单独 DataGridView 时,我希望这个 DataGridView 发生变化(最初是空白的,并且没有绑定到任何东西)。

我相信你以前见过这样的东西,让我画一个图表。这将是某人在左侧 DataGridView 表中选择了 Row1,然后点击拉取按钮将其拉到右侧 DataGridView 表的示例:

Database:                       ToBeDeleted:
Row1               ______       Row1
Row2               |Pull|
Row3               |--->|                                                ______________
etc..              ------                                               |Remove Records|

现在,当用户将左表中的一条记录“拉”到右表时,我想左表更新自身以不再包含该行。这样,用户就不能将同一行中的两个添加到右侧表中,并且它会立即反映他们即将进行的更改(因为右侧表表示要从左侧表中删除的记录)。

【问题讨论】:

  • 如果绑定,则从数据源中删除/移除
  • 没有其他方法可以做到这一点吗?因为目前他们可以将同一行的 2 条拉到右侧表中,点击 Remove Record 按钮,然后由于尝试从数据库中删除两次相同的记录而引发数据库异常。
  • 也许一种解决方案是简单地检查右侧表格中的任何行并检查要拉出的行,如果有任何重复,则显示礼貌的 MessageBox 弹出窗口,告诉他们将同一行添加两次(以及取消操作)。这不是用户友好的,但它就足够了。
  • 而不是要删除的范例,为什么不直接删除呢?另一种方法是有一个隐藏列来标记要删除的列,然后过滤掉 DB DGV 中的 ToBeDeleted 列。然后,当您确实要删除时,只处理 DB DGV - 另一个是眼睛糖果
  • @Musicode 在不知道您的 DAL 是如何设置的情况下,听起来好像您受到了 IDE 的限制。也许现在是学习如何以编程方式进行操作的时候了?照原样使用数据表:只需克隆表并将其用作正确的 DGV 数据源。然后,每当拖动一行时,导入该行(克隆表)并删除(源表)。

标签: vb.net winforms datagridview


【解决方案1】:

我认为您的项目没有任何问题,而且不难做到。 我在这个示例中使用Linq To Entities,所以我将我的数据库表映射为对象。

  1. 创建 2 个数据绑定 DGV,将它们绑定到 2 个差异数据源 (BindingSource) 并选择 Object。对象类型是相同的,因为您将它们绑定到同一个数据库表(在我的例子中,行对象被称为它的表,Table3
  2. 左侧 DGV 绑定到 Table3BindingSource,右侧 DGV 绑定到 Table3BindingSourceTBD
  3. 从数据库中获取左侧 DGV 的数据(从表中进行基本选择)
  4. 按钮 Pull 从左侧 dgv 中删除一个对象并将其添加到另一个对象
  5. 按钮Delete 只是循环通过正确的行,并处理数据库删除操作
  6. 最后,查询您的数据库以获取更新的数据(左 dgv)并清除右 dgv

样本:

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    GetData()
End Sub

Sub GetData()
    Dim db = New StackOverflowEntities

    Table3BindingSource.DataSource = db.Table3.OrderBy(Function(x) x.Id).ToList()
End Sub


Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

    Try
        Dim x = CType(Table3BindingSource.Current, Table3)
        'remove from left dgv
        Table3BindingSource.RemoveCurrent()
        'add to right dgv
        Table3BindingSourceTBD.Add(x)
    Catch ex As Exception
    End Try

End Sub

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    'delete rows in datagridview TBD

    Dim db = New StackOverflowEntities
    'loop rows
    For Each r In Table3BindingSourceTBD

        'cast right dgv row to underlying object
        Dim y = CType(r, Table3)

        'set object to be deleted
        Dim dr = (From x In db.Table3
                 Where x.Id = y.Id
                 Select x).Single()

        db.Table3.DeleteObject(dr)
    Next

    Try
        'commit changes to db
        db.SaveChanges()
        MsgBox("db updated")

    Catch ex As Exception

    Finally
        'refresh all data in left dgv
        GetData()
        'simply clear right dgv
        Table3BindingSourceTBD.Clear()
    End Try
End Sub

我使用基本的Linq To Entities,但任何东西都可以工作(纯 SQL、Linq2SQL...)。如果您需要项目来源,请询问

祝你好运

【讨论】:

  • 所以这是关于编辑 BindingSource 而不是 DGV 本身。我使用的是 DataSources 而不是 BindingSources,但也许这可以改变。现在我已经设置好了,如果他们尝试添加重复的行,就会弹出一个错误框,这很粗糙,但它可以工作,但我会看看我是否可以更改为在这个应用程序的上下文中使用 BindingSources。跨度>
  • 很好的解决方案,被选为答案。不是使用 LINQ 将数据库表直接连接到 DataGridView,而是先将其连接到 BindingSource。这也提供了许多 DGV 可能没有的扩展功能,例如排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2011-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多