【发布时间】:2016-10-27 12:46:25
【问题描述】:
我们在 Windows 窗体中有一个非常奇怪的问题,我们似乎无法弄清楚。
我们的 Windows 窗体有一个 DataGridView,第一列有一个 DataGridViewCheckBoxColumn。
我们添加了以下功能,允许用户移动->单击以选择此网格中的多行:
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;
}
}
代表活动二:
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;
}
}
这允许用户为复选框选择全部或不选择。
选择选择所有选择时,检查所有复选框:
但是,选择“选择无”选项时:所有复选框都被取消选中,除了在 Shift-Click 事件中选中的最后一个:
我认为遍历所有网格行并将复选框设置为未选中就足够了,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;
}
}
但是,似乎有某种状态属性不允许更改该行中的此复选框。
提前致谢。
【问题讨论】:
-
您是否尝试过使用断点调试整个场景?
-
是的,我们已经做到了。谢谢
标签: c# windows winforms checkbox datagridview