Vb.net Windows窗体应用程序基础:从绑定的DataGridView中删除行

Vb.net Windows窗体应用程序基础:从绑定的DataGridView中删除行,vb.net,winforms,datagridview,Vb.net,Winforms,Datagridview,我在WinForms应用程序上有一个DataGridView控件,它是从数据库中的一个表绑定的。我希望每当用户将一行从DataGridView“拉入”到位于其旁边的单独DataGridView时,此DataGridView都会更改(最初为空,不绑定任何内容) 我相信你以前见过类似的情况,让我画一张图表。例如,有人在左侧DataGridView表中选择了行1,然后点击Pull按钮将其拉至右侧DataGridView表: Database: ToBeDel

我在WinForms应用程序上有一个DataGridView控件,它是从数据库中的一个表绑定的。我希望每当用户将一行从DataGridView“拉入”到位于其旁边的单独DataGridView时,此DataGridView都会更改(最初为空,不绑定任何内容)

我相信你以前见过类似的情况,让我画一张图表。例如,有人在左侧DataGridView表中选择了行1,然后点击Pull按钮将其拉至右侧DataGridView表:

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

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

我认为您的项目没有任何错误,这并不难做到。 我在这个示例中使用
Linq To Entities
,因此我将数据库表映射为对象

  • 创建2个数据绑定DGV,将它们绑定到2个不同的数据源(
    BindingSource
    ),然后选择
    Object
    。对象类型是相同的,因为您将它们绑定到同一个数据库表(在我的示例中,行对象被称为其表,
    Table3
  • 左侧DGV绑定到
    Table3BindingSource
    ,右侧DGV绑定到
    Table3BindingSourceTBD
  • 从数据库中获取左侧DGV的数据(从表中进行基本选择)
  • 按钮
    Pull
    从左侧dgv中删除一个对象并将其添加到另一个dgv中
  • 按钮
    Delete
    只需循环通过正确的行,并处理db Delete操作
  • 最后,查询数据库中的更新数据(左侧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
    
    我使用basic
    Linq转换实体
    ,但任何东西都可以工作(纯SQL、Linq2SQL…)。如果你需要项目的来源,只要问


    祝你好运

    如果它已绑定,你会从数据源中删除/删除它,而没有其他方法可以实现这一点?因为目前他们可以将同一行中的2行拖到右侧表中,点击“删除记录”按钮,然后抛出数据库异常,因为同一记录尝试从数据库中删除了两次。也许一种解决方案是只需检查右侧表中的任何行,并检查要拖的行,如果有任何重复,则会显示一个礼貌的MessageBox弹出窗口,告诉他们正在添加同一行两次(以及取消操作)。这对用户来说并不友好,但已经足够了。与其使用“待删除”范例,为什么不直接删除它呢?另一种方法是使用隐藏列标记要删除的内容,然后在DB DGV中过滤掉要删除的内容。然后,当您着手删除时,只处理DB DGV-另一个是eyecandy@Musicode在不知道DAL是如何设置的情况下,听起来似乎您受到IDE的约束。也许现在是学习如何以编程方式实现它的时候了?按原样使用数据表:只需克隆该表并将其用作您的右侧DGVs数据源。然后,每当拖动一行时,导入该行(克隆表)并删除(源表)。因此,它是关于编辑BindingSource,而不是DGV本身。我使用的是数据源而不是BindingSources,但也许这可以改变。现在我已经设置好了,如果他们试图添加一个重复的行,就会弹出一个错误框,虽然这很粗糙,但它可以工作,但我会看看是否可以在这个应用程序的上下文中更改为使用BindingSources。很好的解决方案,选择作为答案。您没有使用LINQ将数据库表直接连接到DataGridView,而是首先将其连接到BindingSource。这提供了DGV可能没有的许多扩展功能,例如排序。