CurrentCellDirtyStateChanged事件代码将复选框的数量限制为(2).具有选中框的行包含可编辑数据,这些数据用于计算其余未选中的只读行中的值。我希望datagrid通过更改选中行的颜色来指示可编辑行,并使其余行为只读。CurrentCellDirtyStateChanged事件用于管理复选框,但与更改行颜色的CellClick事件冲突。框不能一致地选中和更改颜色。如有任何帮助,将不胜感激。
using System.Linq;
private void dgvParameters_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (dgvParameters.CurrentCell is DataGridViewCheckBoxCell && dgvParameters.IsCurrentCellDirty && !(bool)dgvParameters.CurrentCell.FormattedValue)
{
var count = dgvParameters.Rows.Cast<DataGridViewRow>()
.SelectMany(r => r.Cells.OfType<DataGridViewCheckBoxCell>()
.Where(c => (bool)c.FormattedValue))
.Count();
if (count == 2) dgvParameters.CancelEdit();
}
}
private void dgvParameters_CellClick(object sender, DataGridViewCellEventArgs e)
{
int index = dgvParameters.CurrentRow.Index;
DataGridViewCellStyle CheckedStyle;
DataGridViewCellStyle UnCheckedStyle;
CheckedStyle = new DataGridViewCellStyle();
UnCheckedStyle = new DataGridViewCellStyle();
CheckedStyle.BackColor = Color.White;
CheckedStyle.ForeColor = Color.Black;
UnCheckedStyle.BackColor = Color.LightGray;
UnCheckedStyle.ForeColor = Color.Black;
bool isSelect = dgvParameters[5, index].Value as bool? ?? false;
if (Convert.ToBoolean(row.Cells[5].Value))
{
dgvParameters.Rows[index].Cells[1].Style = CheckedStyle;
dgvParameters.Rows[index].Cells[3].Style = CheckedStyle;
dgvParameters.Rows[index].Cells[1].ReadOnly = false;
dgvParameters.Rows[index].Cells[3].ReadOnly = false;
}
else
{
dgvParameters.Rows[index].Cells[1].Style = UnCheckedStyle;
dgvParameters.Rows[index].Cells[3].Style = UnCheckedStyle;
dgvParameters.Rows[index].Cells[1].ReadOnly = true;
dgvParameters.Rows[index].Cells[3].ReadOnly = true;
}
}
2条答案
按热度按时间pgccezyw1#
您可以继续使用
CurrentCellDirtyStateChanged
方法,并处理CellValueChanged
事件,以便根据DataGridViewCheckBoxCell
的新值设置同一行的相关单元格的属性。首先,确保您通过设计器或代码设置了目标单元格的默认值。我假设复选框单元格的初始值为
false
。其次,修改
CurrentCellDirtyStateChanged
事件如下...请注意,
dgvParameters.CommitEdit(DataGridViewDataErrorContexts.Commit);
行是用来应用的,并在切换值时查看结果。如果需要保持当前行的脏状态并在单元格离开时提交更改,请注解该行。最后,如果
e.ColumnIndex
是复选框单元格的索引,则处理CellValueChanged
事件以更新目标单元格...这样,您只需处理一行,而无需考虑其余行。
6jygbczu2#
您的问题是希望未选中的行设置为只读。一个明显的冲突是,如果某行的整体确实是只读的,那么就没有办法选中它使其可编辑。我的第一个建议是创建一个
refreshStyles
方法,该方法考虑了哪些单元格是DataGridViewCheckBoxCell
,这样,无论行。这是使DGV以只读行和可编辑行的混合形式显示的一个步骤。
这一切都是基于将DGV的
DataSource
属性设置为类DgvItem
的绑定列表,该类的最低实现如图所示。将IsChecked
设置为绑定属性的原因是为了让DataSource在其值更改时发送通知(否则它只在添加或删除项时通知)。初始化
剩下的唯一事情就是在
MainForm
中的Load
事件的override
中将它们粘合在一起。我希望这能给你一些实现你想要的结果的想法。