2017-10-05 36 views
4

嗨,我正在C#中创建一个应用程序。在鼠标单击时保持多重选择并执行其他功能

我想实现

  • 的DataGridView
  • 然后选择多行与CTRL结果中我右键点击它,它显示选项
  • 我点击到选择选项
  • 只选择行停留在的DataGridView和其他行被删除

问题在哪里卡住了

  • 我选择多行与CTRL
  • 但是,当我右键点击在多行选择消失

注意:我正在使用MouseClick事件来右键单击行并生成一个菜单。此事件的代码如下:

private void SearchPanelDataGridView_MouseClick(object sender, MouseEventArgs e) 
{ 
    if (e.Button == MouseButtons.Right) 
    { 
     ContextMenuStrip smenu = new System.Windows.Forms.ContextMenuStrip(); 
     var htest = SearchPanelDataGridView.HitTest(e.X, e.Y); 
     SearchPanelDataGridView.ClearSelection(); 
     SearchPanelDataGridView.Rows[htest.RowIndex].Selected = true; 

     smenu.Items.Add("Clear Record").Name = "Clear Record"; 
     smenu.Items.Add("Pay Amount").Name = "Pay Amount"; 
     smenu.Items.Add("Break Apart").Name = "Break Apart"; 
     smenu.Items.Add("View Details").Name = "View Details"; 
     smenu.Items.Add("Choose Selected").Name = "Choose Selected"; // Choose Rows Option 
     smenu.Items.Add("Reset").Name = "Reset"; 

     int CurrentMouseOverRow = SearchPanelDataGridView.HitTest(e.X, e.Y).RowIndex; 
     smenu.Show(SearchPanelDataGridView, new Point(e.X, e.Y)); 
     smenu.ItemClicked += new ToolStripItemClickedEventHandler(smenu_ItemClicked); 
    } 
} 

回答

1

您不需要处理MouseClick事件。只需使用设计器或在窗体的加载事件中创建ContextmenuStrip。然后,上下文菜单条分配给DataGridViewContextMenuStrip属性,则处理Click事件ToolStripMenuItem应除去非选择的行,并使用这样的代码的:

dataGridView1.Rows.Cast<DataGridViewRow>() 
    .Where(x => !dataGridView1.SelectedRows.Contains(x) && !x.IsNewRow) 
    .ToList().ForEach(x => dataGridView1.Rows.Remove(x)); 

这种方式,所有的非选择的行会被删除而选择将保持不变。

+0

让我知道如果你有任何问题的答案:) –

0

这可能不是最好的解决办法,但现在你可以试试这个:

List<int> selectedRowsIndexes = new List<int>(); 
    private void dataGridView1_Click(object sender, EventArgs e) 
    { 
     selectedRowsIndexes.Clear(); 
     foreach (DataGridViewRow row in dataGridView1.SelectedRows) 
      selectedRowsIndexes.Add(row.Index); 
    } 

    private void dataGridView1_MouseClick(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      ContextMenuStrip smenu = new System.Windows.Forms.ContextMenuStrip(); 
      var htest = dataGridView1.HitTest(e.X, e.Y); 
      dataGridView1.ClearSelection(); 
      dataGridView1.Rows[htest.RowIndex].Selected = true; 

      smenu.Items.Add("Clear Record").Name = "Clear Record"; 
      smenu.Items.Add("Pay Amount").Name = "Pay Amount"; 
      smenu.Items.Add("Break Apart").Name = "Break Apart"; 
      smenu.Items.Add("View Details").Name = "View Details"; 
      smenu.Items.Add("Choose Selected").Name = "Choose Selected"; // Choose Rows Option 
      smenu.Items.Add("Reset").Name = "Reset"; 

      int CurrentMouseOverRow = dataGridView1.HitTest(e.X, e.Y).RowIndex; 
      smenu.Show(dataGridView1, new Point(e.X, e.Y)); 

      foreach (int rowIndex in selectedRowsIndexes) 
      { 
       for (int i = 0; i < dataGridView1.Rows.Count; i++) 
       { 
        dataGridView1.Rows[i].Selected = (i == rowIndex); 
       } 
      } 
     } 
    } 

对于这项工作,在DataGridView的SelectionMode属性应该设置为FullRowSelect。

相关问题