Winforms 基于隐藏列的DataGridView行格式
有没有办法根据用户看不到的列中的某个值设置行的样式?网格包含两行,如果删除了一些行,我希望它们被涂成红色。我有一个隐藏列,如果列被删除,它将存储true,否则将存储false。我尝试了Winforms 基于隐藏列的DataGridView行格式,winforms,datagridview,Winforms,Datagridview,有没有办法根据用户看不到的列中的某个值设置行的样式?网格包含两行,如果删除了一些行,我希望它们被涂成红色。我有一个隐藏列,如果列被删除,它将存储true,否则将存储false。我尝试了CellFormatting,但由于我的列不可见,e.ColumnIndex从未为我的隐藏列提供正确的值 任何帮助都将不胜感激 编辑: 下面是我试图完成的一个图像。您可以看到第二行的文本为红色,这是由于用户在datagrid中看不到的列中的值造成的。当用户第一次看到表单时(加载时),这个网格应该是这样的颜色 根据我
CellFormatting
,但由于我的列不可见,e.ColumnIndex
从未为我的隐藏列提供正确的值
任何帮助都将不胜感激
编辑:
下面是我试图完成的一个图像。您可以看到第二行的文本为红色,这是由于用户在datagrid中看不到的列中的值造成的。当用户第一次看到表单时(加载时),这个网格应该是这样的颜色
根据我的理解,当列在DataGridView中是不可见列时,需要获取列的值 是这样吗?如果我错了,请纠正我
private void button1_Click(object sender, EventArgs e)
{
dataGridView1.DataSource = CreateDataTable();
dataGridView1.Columns["ID"].Visible = false; // Set the ID column invisible.
MessageBox.Show(dataGridView1.Rows[2].Cells["ID"].Value.ToString()); // Get the ID column value.
}
对于未绑定的数据,请尝试使用
CellValueChanged
,而不是CellFormatting
,对于绑定的数据集,请尝试使用DataBindingComplete
。例如,假设您正在使用以下按钮“删除/取消删除”一行。单击事件:
private void Button1_Click(object sender, EventArgs e)
{
bool value = (bool)dataGridView1.CurrentRow.Cells["Deleted"].Value;
dataGridView1.CurrentRow.Cells["Deleted"].Value = !value;
// For bound data (like a DataTable) add the following line:
// ((DataTable)dataGridView1.DataSource).AcceptChanges();
}
未绑定数据
以这种方式更改行“deleted”列值将触发以下事件处理程序。因此,您可以根据该列的值True
或False
为行着色:
private void DataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == dataGridView1.Columns["Deleted"].Index)
{
dataGridView1.Rows[e.RowIndex].DefaultCellStyle.ForeColor = (bool)dataGridView1[e.ColumnIndex, e.RowIndex].Value ? Color.Red : Color.Black;
}
}
绑定数据
对于绑定数据,例如来自DataTable
,处理DataBindingComplete
事件就足够了。此事件将在第一次设置绑定时以及更改后(例如从按钮1进行的更改)触发。单击事件。在这里,您将遍历行,并根据隐藏列的值设置所需的样式。(请注意,对于具有数据表
源的网格,对按钮1\u Click
事件处理程序的额外更改。这是立即更改样式所必需的,否则在导航到其他行之前不会发生此更改。)
请发一张MCVE。一张预期结果的图片也会很有帮助。我需要根据dataGridView中不可见的列中的某些值为某些行上色。我可以得到值,但我想使用一些事件来给行着色。我找了一整天这个答案:((我发现了很多相同问题的不完整答案。谢谢@OhBeWise@ValiMaties很乐意帮忙!
private void DataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
foreach (DataGridViewRow row in dataGridView1.Rows)
{
row.DefaultSCellStyle.ForeColor = (bool)row.Cells["Deleted"].Value ? Color.Red : Color.Black;
}
}