PJW*_*PJW 77 c# datagridview winforms
我有一个winforms应用程序,并希望在DataGridView
选中/取消选中控件中嵌入的复选框时触发一些代码.我尝试过的每一件事
CheckBox
单击时但在其检查状态发生变化之前触发,或者CheckBox
失去焦点时触发我似乎无法找到在检查状态更改后立即触发的事件.
编辑:
我想实现的是,当检查的状态CheckBox
的一个DataGridView
变化,在其他两个数据DataGridView
变迁.然而,我使用的所有事件中,其他网格中的数据仅CheckBox
在第一次DataGridView
失去焦点后才会发生变化.
Moo*_*ght 85
要处理DatGridView
s CheckedChanged
事件,你必须先CellContentClick
触发(没有CheckBox
es当前状态!)然后调用CommitEdit
.这将反过来触发CellValueChanged
您可以用来完成工作的事件.这是微软的疏忽.做一些像下面这样的事情......
private void dataGridViewSites_CellContentClick(object sender,
DataGridViewCellEventArgs e)
{
dataGridViewSites.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
/// <summary>
/// Works with the above.
/// </summary>
private void dataGridViewSites_CellValueChanged(object sender,
DataGridViewCellEventArgs e)
{
UpdateDataGridViewSite();
}
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助.
jst*_*ant 81
我找到了@ Killercam的解决方案,但是如果用户双击太快就会有点狡猾.不确定是否其他人发现了这种情况.我找到了另一种解决方案在这里.
它使用datagrid CellValueChanged
和CellMouseUp
.长虹解释说
"原因是OnCellvalueChanged事件不会触发,直到DataGridView认为你已经完成编辑.这使得TextBox列的感觉,因为OnCellvalueChanged不会[麻烦]为每次击键触发,但它没有[对于CheckBox来说有意义."
这是他的例子:
private void myDataGrid_OnCellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == myCheckBoxColumn.Index && e.RowIndex != -1)
{
// Handle checkbox state change here
}
}
Run Code Online (Sandbox Code Playgroud)
并且告诉复选框的代码在单击时完成编辑,而不是等到用户离开字段:
private void myDataGrid_OnCellMouseUp(object sender,DataGridViewCellMouseEventArgs e)
{
// End of edition on each click on column of checkbox
if (e.ColumnIndex == myCheckBoxColumn.Index && e.RowIndex != -1)
{
myDataGrid.EndEdit();
}
}
Run Code Online (Sandbox Code Playgroud)
jsturtevants的解决方案非常有效.但是,我选择在EndEdit事件中进行处理.我更喜欢这种方法(在我的应用程序中),因为与CellValueChanged事件不同,在填充网格时不会触发EndEdit事件.
这是我的代码(其中一部分是从jsturtevant偷来的:
private void gridCategories_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == gridCategories.Columns["AddCategory"].Index)
{
//do some stuff
}
}
private void gridCategories_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.ColumnIndex == gridCategories.Columns["AddCategory"].Index)
{
gridCategories.EndEdit();
}
}
Run Code Online (Sandbox Code Playgroud)
小智 8
Ben Voigt 在上面的评论回复中找到了最佳解决方案:
private void dgvStandingOrder_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (dgvStandingOrder.CurrentCell is DataGridViewCheckBoxCell)
dgvStandingOrder.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
Run Code Online (Sandbox Code Playgroud)
说真的,这就是你所需要的。
小智 6
这是一些代码:
private void dgvStandingOrder_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (dgvStandingOrder.Columns[e.ColumnIndex].Name == "IsSelected" && dgvStandingOrder.CurrentCell is DataGridViewCheckBoxCell)
{
bool isChecked = (bool)dgvStandingOrder[e.ColumnIndex, e.RowIndex].EditedFormattedValue;
if (isChecked == false)
{
dgvStandingOrder.Rows[e.RowIndex].Cells["Status"].Value = "";
}
dgvStandingOrder.EndEdit();
}
}
private void dgvStandingOrder_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
dgvStandingOrder.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
private void dgvStandingOrder_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (dgvStandingOrder.CurrentCell is DataGridViewCheckBoxCell)
{
dgvStandingOrder.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
Run Code Online (Sandbox Code Playgroud)
小智 6
按照 Killercam'answer,我的代码
private void dgvProducts_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
dgvProducts.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
Run Code Online (Sandbox Code Playgroud)
和 :
private void dgvProducts_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (dgvProducts.DataSource != null)
{
if (dgvProducts.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString() == "True")
{
//do something
}
else
{
//do something
}
}
}
Run Code Online (Sandbox Code Playgroud)
小智 5
这也处理键盘激活.
private void dgvApps_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if(dgvApps.CurrentCell.GetType() == typeof(DataGridViewCheckBoxCell))
{
if (dgvApps.CurrentCell.IsInEditMode)
{
if (dgvApps.IsCurrentCellDirty)
{
dgvApps.EndEdit();
}
}
}
}
private void dgvApps_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
// handle value changed.....
}
Run Code Online (Sandbox Code Playgroud)