2017-10-05 6 views
4

こんにちは私はC#でアプリケーションを作っています。マウスクリックでマルチセレクトを維持し、さらに機能を実行してください

私は

  • を達成しようとしています私はDataGridViewの
  • における結果のうちCTRLを持つ複数の行を選択し、私はそれを右クリックして、それは私がクリック
  • オプションを示し〜に選択を選択オプション
  • 選択した行のDataGridViewと他の行に滞在が

を除去して、私は

  • を捕まってしまった問題は、私はCTRL
  • を持つ複数の行を選択しかし、私は右クリックしたときに行の複数の選択が消えます。

注:私は行を右クリックしてメニューを生成するためにMouseClick Eventを使用しています。このイベントのコードは次のとおりです。

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プロパティにコンテキストメニューストリップを割り当て、その後、非選択行を削除し、そのようなコードを使用する必要がありますToolStripMenuItemClickイベントハンドル:

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に設定する必要があります。

関連する問題