わかりにくいWindowsフォームでは非常に奇妙な問題があります。Windowsフォーム - > DataGridView-> DataGridViewCheckBoxColumnすべてのチェックを外す1つの項目をチェック
Windowsフォームには、最初の列にDataGridViewCheckBoxColumnを持つDataGridViewがあります。
我々は、ユーザーが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;
}
}
}
これは期待どおりに動作しています。
我々はまた、右クリックイベントの制御にいる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を選択するようにユーザーに許可します。
すべて選択選択を選択すると、すべてのチェックボックスがチェックされている:
しかし選択なし]オプションが選択されている場合:
最後にチェックインされたものを除き、すべてのチェックボックスは選択解除されていますShiftキーを押しながらクリックしてイベントを:
私は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;
}
}
は、しかしがあるように思われますその行のこのチェックボックスを変更できないような状態プロパティのようなものです。
ありがとうございます。
ブレークポイントを使用してシナリオ全体をデバッグしようとしましたか? –
はい、私たちはそれをしました。 ありがとう、 – jazzBox