2016-06-24 2 views
4

わかりにくいWindowsフォームでは非常に奇妙な問題があります。Windowsフォーム - > DataGridView-> DataGridViewCheckBoxColumnすべてのチェックを外す1つの項目をチェック

Windowsフォームには、最初の列にDataGridViewCheckBoxColumnを持つDataGridViewがあります。

enter image description here

我々は、ユーザーがSHIFT-することを可能にする以下の機能を追加しました>このグリッドの複数の行をクリックして選択します:

int colHit = gvLibrary.HitTest(e.X, e.Y).ColumnIndex; 
     int lastRowHit; 
     //mouse left click 
     if (e.Button == MouseButtons.Left) 
     { 
      if (colHit == 0) 
      { 
       if (Control.ModifierKeys == Keys.Shift) 
       { 
        lastRowHit = gvLibrary.HitTest(e.X, e.Y).RowIndex; 
        ShiftClickCheckBoxSetter(this.gvLibrary, int.Parse(txtFirstClickRow.Text), lastRowHit); 

       } 
       else 
       { 
        int firstRowHit = gvLibrary.HitTest(e.X, e.Y).RowIndex; 
        txtFirstClickRow.Text = firstRowHit.ToString(); 
       } 
      } 
     } 

ここCheckBoxSetterコードです:

private void ShiftClickCheckBoxSetter(DataGridView dataGridView, int p, int lastRowHit) 
    { 
     if (p < lastRowHit) 
     { 
      for (int i = p; i < lastRowHit; i++) 
      { 
       dataGridView.Rows[i].Cells[0].Value = true; 
      } 
     } 
     else// 
     { 
      for (int i = p; i >= lastRowHit; i--) 
      { 
       dataGridView.Rows[i].Cells[0].Value = true; 
      } 
     } 
    } 

これは期待どおりに動作しています。

enter image description here

我々はまた、右クリックイベントの制御にいるContextMenuStripを追加しました。

else if (e.Button == MouseButtons.Right) 
     { 
      if (colHit != 0) 
      { 
       ContextMenuStrip m = new ContextMenuStrip(); 
       m.Items.Add("Select All", null, m_LibraryItemClicked); 
       m.Items.Add("Select None", null, m_LibraryItemClickedNone); 
       m.Show(gvLibrary, e.Location); 
      } 
     } 

委任イベントの一つ:

 void m_LibraryItemClicked(object sender, EventArgs e) { 
     foreach (DataGridViewRow dgvr in gvLibrary.Rows) 
     { 
      if (dgvr.Selected) { 
       dgvr.Selected = false; 
      } 

      dgvr.Cells["LSelect"].Value = true; 
     } 
    } 

委任イベント2:

private void m_LibraryItemClickedNone(object sender, EventArgs e) 
    { 
     foreach (DataGridViewRow dgvr in gvLibrary.Rows) 
     { 
      if (dgvr.Selected) 
       dgvr.Selected = false; 

      dgvr.Cells["LSelect"].Value = false; 
     } 
    } 

これは、すべてを選択するか、チェックボックスのためにnoneを選択するようにユーザーに許可します。

すべて選択選択を選択すると、すべてのチェックボックスがチェックされている

Select All/Select None

All Selected

しかし選択なし]オプションが選択されている場合:

Select None

最後にチェックインされたものを除き、すべてのチェックボックスは選択解除されていますShiftキーを押しながらクリックしてイベントを:

All But One

私はIE、グリッドのすべての行を反復処理し、選択しないようにする]チェックボックスを設定することで十分だろうと思うだろう:

private void m_LibraryItemClickedNone(object sender, EventArgs e) 
    { 
     foreach (DataGridViewRow dgvr in gvLibrary.Rows) 
     { 
      if (dgvr.Selected) 
       dgvr.Selected = false; 

      dgvr.Cells["LSelect"].Value = false; 
     } 
    } 

は、しかしがあるように思われますその行のこのチェックボックスを変更できないような状態プロパティのようなものです。

ありがとうございます。

+0

ブレークポイントを使用してシナリオ全体をデバッグしようとしましたか? –

+0

はい、私たちはそれをしました。 ありがとう、 – jazzBox

答えて

1

コードをチェックして、この現象を再現することができました。問題は現在のセル(選択されているセルではない)にあるようです。この特定のセルを変更しようとすると、アクションはすぐに実行されません。

この動作を変更するには、 "LSelect"セルの値を変更する前にdataGridView1.CurrentCell = null;を追加します。これで問題は解決します。

private void m_LibraryItemClickedNone(object sender, EventArgs e) 
{ 
    dataGridView1.CurrentCell = null;  
    foreach (DataGridViewRow dgvr in gvLibrary.Rows) 
    { 
     if (dgvr.Selected) 
      dgvr.Selected = false; 

     dgvr.Cells["LSelect"].Value = false; 
    } 
} 
+0

ありがとう、RomCoo! これは機能します! – jazzBox

関連する問題