DataGridView复选框事件 [英] DataGridView CheckBox events
问题描述
我使用一系列复选框在 DataGridView
中创建水平和垂直相同的标签。任何相同的标签,复选框将处于非活动状态,我只希望每个组合的两个检查中的一个有效。下面的截图显示了我有什么:
I'm making a DataGridView
with a series of Checkboxes in it with the same labels horizontally and vertically. Any labels that are the same, the checkboxes will be inactive, and I only want one of the two "checks" for each combination to be valid. The following screenshot shows what I have:
在下半部分选中的任何东西,我想在上面联合检查。因此,如果选中[quux,spam](或基于零的坐标的[7,8]),则我想取消选中[spam,quux]([8,7])。我到目前为止是以下:
Anything that's checked on the lower half, I want UN-checked on the upper. So if [quux, spam] (or [7, 8] for zero-based co-ordinates) is checked, I want [spam, quux] ([8, 7]) un-checked. What I have so far is the following:
dgvSysGrid.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
dgvSysGrid.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
string[] allsysNames = { "heya", "there", "lots", "of", "names", "foo", "bar", "quux", "spam", "eggs", "bacon" };
// Add a column for each entry, and a row for each entry, and mark the "diagonals" as readonly
for (int i = 0; i < allsysNames.Length; i++)
{
dgvSysGrid.Columns.Add(new DataGridViewCheckBoxColumn(false));
dgvSysGrid.Columns[i].HeaderText = allsysNames[i];
dgvSysGrid.Rows.Add();
dgvSysGrid.Rows[i].HeaderCell.Value = allsysNames[i];
// Mark all of the "diagonals" as unable to change
DataGridViewCell curDiagonal = dgvSysGrid[i, i];
curDiagonal.ReadOnly = true;
curDiagonal.Style.BackColor = Color.Black;
curDiagonal.Style.ForeColor = Color.Black;
}
// Hook up the event handler so that we can change the "corresponding" checkboxes as needed
//dgvSysGrid.CurrentCellDirtyStateChanged += new EventHandler(dgvSysGrid_CurrentCellDirtyStateChanged);
dgvSysGrid.CellValueChanged += new DataGridViewCellEventHandler(dgvSysGrid_CellValueChanged);
}
void dgvSysGrid_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
Point cur = new Point(e.ColumnIndex, e.RowIndex);
// Change the diagonal checkbox to the opposite state
DataGridViewCheckBoxCell curCell = (DataGridViewCheckBoxCell)dgvSysGrid[cur.X, cur.Y];
DataGridViewCheckBoxCell diagCell = (DataGridViewCheckBoxCell)dgvSysGrid[cur.Y, cur.X];
if ((bool)(curCell.Value) == true)
{
diagCell.Value = false;
}
else
{
diagCell.Value = true;
}
}
/// <summary>
/// Change the corresponding checkbox to the opposite state of the current one
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void dgvSysGrid_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
Point cur = dgvSysGrid.CurrentCellAddress;
// Change the diagonal checkbox to the opposite state
DataGridViewCheckBoxCell curCell = (DataGridViewCheckBoxCell)dgvSysGrid[cur.X, cur.Y];
DataGridViewCheckBoxCell diagCell = (DataGridViewCheckBoxCell)dgvSysGrid[cur.Y, cur.X];
if ((bool)(curCell.Value) == true)
{
diagCell.Value = false;
}
else
{
diagCell.Value = true;
}
}
问题出现了如果我使用 CellValueChanged
事件,你实际上点击的一个后面,我不知道如何获取当前单元格,如果我在脏状态作为curCell作为一个null(建议当前单元格的地址是不正确的,但我没有尝试,并得到该值出来)意味着路径不工作。
The problem comes is that the cell value changed always seems to be "one behind" where you actually click if I use the CellValueChanged
event, and I'm not sure how to get the current cell if I'm in the "dirty" state as curCell comes in as a null (suggesting the current cell address is wrong somehow, but I didn't try and get that value out) meaning that path isn't working at all.
基本上,如何获得具有正确布尔值的正确地址,以便我的翻转算法可以工作?
Basically, how do I get the "right" address with the right boolean value so that my flipping algorithm will work?
推荐答案
最终,它是 CurrentCellDirtyStateChanged
事件,但是你需要以正确的方式做。正确的方式是 MSDN
Ultimately, it was the CurrentCellDirtyStateChanged
event that does it, but you need to do it in the right way. And the right way is MSDN's, though it doesn't make sense at first glance.
从上面的片段,我最终做的是下面:
A fragment from above, and what I ultimately did is below:
// Hook up the event handler so that we can change the "corresponding" checkboxes as needed
dgvSysGrid.CurrentCellDirtyStateChanged += new EventHandler(dgvSysGrid_CurrentCellDirtyStateChanged);
dgvSysGrid.CellValueChanged += new DataGridViewCellEventHandler(dgvSysGrid_CellValueChanged);
}
void dgvSysGrid_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
Point cur = new Point(e.ColumnIndex, e.RowIndex);
// Change the diagonal checkbox to the opposite state
DataGridViewCheckBoxCell curCell = (DataGridViewCheckBoxCell)dgvSysGrid[cur.X, cur.Y];
DataGridViewCheckBoxCell diagCell = (DataGridViewCheckBoxCell)dgvSysGrid[cur.Y, cur.X];
if ((bool)(curCell.Value) == true)
{
diagCell.Value = false;
}
else
{
diagCell.Value = true;
}
}
void dgvSysGrid_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (dgvSysGrid.IsCurrentCellDirty)
{
dgvSysGrid.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
基本上, c> CurrentCellDirtyStateChanged 事件触发 CellValueChanged
事件,就是这样。如果你只是附加 CellValueChanged
事件,那么它只有在你离开单元格后触发。我不知道为什么(考虑到它是一个复选框,不是立即做),但这是发生了什么。和上面的代码工作,因为复选框的改变在点击它向右移动。所以它工作。
Basically, all that's happening is the CurrentCellDirtyStateChanged
event triggers the CellValueChanged
event, and that's it. If you just attach the CellValueChanged
event, then it only triggers AFTER you have left the cell. I don't know why exactly (considering it's a checkbox, isn't it "done" immediately?), but that's what happens. And the code as above works, in that the check box changes go in RIGHT away when clicking it. So it works.
这篇关于DataGridView复选框事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!