vb.net – 将选中的行显示到另一个DataGridView中

我有一个DataGridView填充了DataTable.
添加了一个CheckBoxColumn来选择一些行.

我的目标是仅将选定的行显示到另一个DataGridView中

我尝试使用Select并将结果添加到新的DataTable来完成此操作,但Select不起作用,因为缺少CheckBoxColumn.

这是我用来填充第一个DataGridView并添加CheckBoxColumn的代码

Dim chk0 As New DataGridViewCheckBoxColumn()
With chk0
    .AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader
    .HeaderText = "Sel"
    .Name = "Sel"
End With
With Me.DataGridView1
    .Columns.Clear()
    .DataSource = DT_Events
    .Columns.Insert(0,chk0)
    .Columns("Event").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
End With

然后,在检查了一些行之后,我尝试将选定的行显示到另一个DataGridView中:

Using DT_Checked As DataTable = CType(Me.DataGridView1.DataSource,DataTable).Select("Sel = 1").CopyToDataTable
    If DT_Checked.Rows.Count > 0 Then
        With Me.DataGridView2
            .Visible = True
            .DataSource = DT_Checked
        End With
    Else
        MsgBox("No rows to show",MsgBoxStyle.Critical,"Error")
    End If
End Using

我尝试了没有Select的代码,它没有显示CheckBoxColumn.
我该怎么办?
我怎么能这样做呢?

将行复制到新的DataTable是浪费的,因为两者之间唯一真正的区别是某个布尔值是True还是False.由于您绑定到DataTable,因此您只需更改每个DGV中显示的视图即可.

标题显示的概念,显示已检查的行…与将代码尝试执行时将行复制到另一个控件不同.这将显示如何使用一个DataSource显示每个DGV中的某些行.

如果您的数据来自数据库,则可以在sql添加一列:

' Access version
Dim sql = "SELECT a,b,c,False AS Selected FROM SAMPLE"

这将为所有行添加一个初始化为False的布尔列,并将在DGV中显示为CheckBox.

如果数据以其他方式进入DataTable,请手动添加列:

dtSample.Columns.Add("Selected",GetType(Boolean))
dtSample.Columns("Selected").DefaultValue = False

' we need to loop and set a value
' if you manually add a column
For Each r As DataRow In dtSample.Rows
    r("Selected") = False
Next

要在一个网格(或列表框或组合)中显示行,或者根据该值显示另一个网格,此代码将使用2个DataView.如果您正在使用视图,那么您经常需要随意更改RowFilter,因此请为表单创建一些全局:

Private dtSample As DataTable          ' base table for BOTH DGVs
Private dvSource As DataView           ' ALL or Selected = False view
Private dvDest As DataView             ' Selected only
...
' build datatable and add the Selected Row (if needed)
...
' create Source DV as Selected = False
dvSource = New DataView(dtSample,"Selected=False","",DataViewRowState.CurrentRows)

' create SELECTED DV as Selected = True
dvSelected = New DataView(dtSample,"Selected=True",DataViewRowState.CurrentRows)

dgv1.DataSource = dvSource
dgv2.DataSource = dvSelected

dvSource是可选的.如果您希望在第一个DGV中显示所有行,那么您就是DataView(根据问题,这似乎是这种情况).

为了便于说明,设置此项以便在DGV1中检查项目时它们会“消失”(因为它们不再符合Selected = False标准),并自动出现在DGV2中(因为现在它们符合该标准.结果:

底部DGV中未选中/未选中的行将滑回到顶部DGV.

这很经济.您不仅不必运行任何代码来向第二个DGV添加或移动行,而且您不会复制DataRows和新的DataTable来执行此操作.通过TaskManager(粗略但指示性),内存量与Selected Rows的变化大致相同;当手动复制它们时,它会在您创建包含相同相同数据的DataRows副本时慢慢爬行.

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 --------------------------...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, t...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integ...