2016-07-01 79 views
0

我遇到了一个问题,在基于数据表值的DataGridView(DGV)中以编程方式进行多选择。我有一个带有“ID”列的表格,我需要将这些值传递给另一个带DGV的表单进行编辑,ID也是第一个DGV列,即对于表格中的每个ID,都应该选择适当的DGV行。 我可以遍历表格和DGV,但只有最后一个值被选中,即使DGV属性MultiSelect = true ...当我手动使用表格时,多个选择都可以正常工作。C#DataGridView多选择被覆盖

foreach(DataRow dtrow in dt.Rows) 
    { 
     string Selection = dtrow["ID"].ToString(); 
     foreach(DataGridViewRow DGVrow in dgview.Rows) 
     {      
      if (DGVrow.Cells[0].Value.ToString().Equals(Selection)) 
      { 
       dgview.CurrentCell = DGVrow.Cells[0]; 
       int cellInx = dgview.CurrentCell.RowIndex; 
       dgview.Rows[cellInx].Selected = true;                      
       break; 
      } 
     } 
    } 
+0

不应该你的选择变量使用dtRow变量?你没有在循环中的任何地方使用dtRow变量。 – LarsTech

+0

对不起,这是一个错字...我更新了代码。 – ArtR45

回答

0

我回答我自己的问题,因为我不认为这是可能的表单加载。我的应用程序有一个用于向项目添加选择的表单。当用户想要“编辑”项目时,我需要调用此表单并完成所有以前的选择,以便用户可以添加/删除。 在启用多选功能的情况下使用DataGridView(DGV)时,在运行时,您可以'ctl-click'并选择多个项目......实质上,我试图在'编辑'窗体加载代码中重新创建此行为'模式。 后的形式被初始化我有一个从OleDb的表加载DGV的方法,测试了这一点我试图把下面的线负载方法调用后和方法调用的最后几行:

 dgv1.Rows[0].Selected = true; 
     dgv1.Rows[1].Selected = true; 
     dgv1.Rows[2].Selected = true; 

显然,在表格加载时,我期待前3行被选中,但这并没有发生。 但是,我记得一个单独的问题,如果没有默认选择的第一行,我永远无法加载DGV ...所以我放入一个'刷新'按钮,只需再次调用'Load'方法...最后一行是:DGV1.Rows[0].Selected = False;使用刷新按钮,DGV在未选择第一行的情况下加载。 我很好奇,如果这是一个类似的情况,所以当我将这3行添加到加载方法的末尾时,表单加载上没有任何事情发生......但是当我点击'刷新'按钮时,前3行被“选中”。

我一直在研究这个超过3天,发现从DataGridView的项目经理(2006年)如下: https://social.msdn.microsoft.com/Forums/windows/en-US/cf351d44-4a9a-4c80-8d52-4fb349847908/multiple-select-is-not-working-for-datagridview?forum=winformsdatacontrols

不幸的是,不是一件容易的解决这个,因为我没有看看这个场景并设计网格来处理这个问题。主要的问题源于这样一个事实,即当您在网格上向下滑动时,网格会在选择下一个单元格/行/列之前设置当前单元格属性,以清除选择内容。所以,当你的代码行选择行时,当你去选择下一行或者使用键盘移动到下一行时,你选择的行被清除。最简单的方法是通过RowPrePaint使用自定义绘画,并使用相同的SelectedBackground颜色绘制“选定”行。您可以查询您正在绘制的行中复选框单元格的值,以确定该行是否“已选中”,但是没有必要将Selected属性设置为true。另一方面,您必须跟踪或枚举所有行,以在给定时间知道所有“选定”行。 - > mark - > DataGridView程序管理器 - 2006

所以我的计划是按照建议重建DGV以使用复选框。我只是想把它放在那里作为一般信息和/或如果有人有一个更好的主意。谢谢