我有一个DataGridView填充了DataTable.
我添加了一个CheckBoxColumn来选择一些行.
我添加了一个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
将行复制到新的DataTable是浪费的,因为两者之间唯一真正的区别是某个布尔值是True还是False.由于您绑定到DataTable,因此您只需更改每个DGV中显示的视图即可.
标题中显示的概念,显示已检查的行…与将代码尝试执行时将行复制到另一个控件不同.这将显示如何使用一个DataSource显示每个DGV中的某些行.
' 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副本时慢慢爬行.