2017-10-05 58 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。

相關問題