c# 从 DataGridView 设置和重置颜色
c# Set and Reset Color from DataGridView
大家好,我使用 DataGridViewCell.Style 属性 为我点击的每个单元格设置背景颜色。
if (e.RowIndex < 0 || e.RowIndex == dataMenu.NewRowIndex)
{
return;
}
var dataGridViewCellStyle = new DataGridViewCellStyle(dataMenu.DefaultCellStyle)
{
BackColor = Color.CornflowerBlue
};
dataMenu[e.ColumnIndex, e.RowIndex].Style = dataGridViewCellStyle;
看起来完全像这样:
但现在我希望如果我单击同一列中的另一个单元格,整个列将背景颜色更改为白色,然后再将下一个单元格设置为 'Color.CornflowerBlue'
我想避免同一列中的多个单元格可以具有相同的颜色。
对于每一列,应该只能在一个单元格上设置颜色!
应该不可能做这样的事情:
正如您在“Montag”列中看到的那样,可以更改多个单元格的颜色。
我希望如果我现在单击“Montag”中的另一个单元格,则应重置整个列并在新的聚焦单元格上设置颜色。
我已经尝试过这段代码:
dataMenu.Columns[e.ColumnIndex].DefaultCellStyle.BackColor = Color.Red;
但这只改变了我写在上面的第一个 BackColor Set 函数后面的 BackColor post。
在设置单元格样式之前,清除同一列上其他单元格的样式。只需对您的初始代码稍作修改
private void DataMenu_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex < 0 || e.RowIndex < 0 || e.RowIndex == dataMenu.NewRowIndex)
{
return;
}
for (int i = 0; i < dataMenu.Rows.Count; i++)
{
var cell = dataMenu[e.ColumnIndex, i];
if (cell.HasStyle)
{
cell.Style = null;
}
}
var style = new DataGridViewCellStyle(dataMenu.DefaultCellStyle)
{
BackColor = Color.CornflowerBlue
};
dataMenu[e.ColumnIndex, e.RowIndex].Style = style;
}
我在重现您的问题时注意到一些 side-effects。决定给出额外的建议,以防万一
设置SelectionBackColor
和SelectionForeColor
默认单元格样式与未选中状态相同
dataMenu.DefaultCellStyle.SelectionBackColor = dataMenu.DefaultCellStyle.BackColor;
dataMenu.DefaultCellStyle.SelectionForeColor = dataMenu.DefaultCellStyle.ForeColor;
您也可以在设计器中完成。 Select 您在设计器中的数据网格视图。在 属性 网格中修改 DefaulCellStyle
属性.
在代码中设置单元格的 Style
时执行相同的操作。
style.SelectionBackColor = style.BackColor;
style.SelectionForeColor = style.ForeColor;
dataMenu[e.ColumnIndex, e.RowIndex].Style = style;
如果您需要取消选择已选择的单元格,那么您可以使用以下代码。如果单击选定的单元格,它会取消选择。
private void DataMenu_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex < 0 || e.RowIndex < 0 || e.RowIndex == dataMenu.NewRowIndex)
{
return;
}
var cell = dataMenu[e.ColumnIndex, e.RowIndex];
if (cell.HasStyle)
{
cell.Style = null;
}
else
{
var style = new DataGridViewCellStyle(dataMenu.DefaultCellStyle)
{
BackColor = Color.CornflowerBlue
};
style.SelectionBackColor = style.BackColor;
style.SelectionForeColor = style.ForeColor;
cell.Style = style;
for (int i = 0; i < dataMenu.RowCount; i++)
{
if (i != e.RowIndex)
{
dataMenu[e.ColumnIndex, i].Style = null;
}
}
}
}
大家好,我使用 DataGridViewCell.Style 属性 为我点击的每个单元格设置背景颜色。
if (e.RowIndex < 0 || e.RowIndex == dataMenu.NewRowIndex)
{
return;
}
var dataGridViewCellStyle = new DataGridViewCellStyle(dataMenu.DefaultCellStyle)
{
BackColor = Color.CornflowerBlue
};
dataMenu[e.ColumnIndex, e.RowIndex].Style = dataGridViewCellStyle;
看起来完全像这样:
但现在我希望如果我单击同一列中的另一个单元格,整个列将背景颜色更改为白色,然后再将下一个单元格设置为 'Color.CornflowerBlue'
我想避免同一列中的多个单元格可以具有相同的颜色。 对于每一列,应该只能在一个单元格上设置颜色!
应该不可能做这样的事情:
正如您在“Montag”列中看到的那样,可以更改多个单元格的颜色。
我希望如果我现在单击“Montag”中的另一个单元格,则应重置整个列并在新的聚焦单元格上设置颜色。
我已经尝试过这段代码:
dataMenu.Columns[e.ColumnIndex].DefaultCellStyle.BackColor = Color.Red;
但这只改变了我写在上面的第一个 BackColor Set 函数后面的 BackColor post。
在设置单元格样式之前,清除同一列上其他单元格的样式。只需对您的初始代码稍作修改
private void DataMenu_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex < 0 || e.RowIndex < 0 || e.RowIndex == dataMenu.NewRowIndex)
{
return;
}
for (int i = 0; i < dataMenu.Rows.Count; i++)
{
var cell = dataMenu[e.ColumnIndex, i];
if (cell.HasStyle)
{
cell.Style = null;
}
}
var style = new DataGridViewCellStyle(dataMenu.DefaultCellStyle)
{
BackColor = Color.CornflowerBlue
};
dataMenu[e.ColumnIndex, e.RowIndex].Style = style;
}
我在重现您的问题时注意到一些 side-effects。决定给出额外的建议,以防万一
设置SelectionBackColor
和SelectionForeColor
默认单元格样式与未选中状态相同
dataMenu.DefaultCellStyle.SelectionBackColor = dataMenu.DefaultCellStyle.BackColor;
dataMenu.DefaultCellStyle.SelectionForeColor = dataMenu.DefaultCellStyle.ForeColor;
您也可以在设计器中完成。 Select 您在设计器中的数据网格视图。在 属性 网格中修改 DefaulCellStyle
属性.
在代码中设置单元格的 Style
时执行相同的操作。
style.SelectionBackColor = style.BackColor;
style.SelectionForeColor = style.ForeColor;
dataMenu[e.ColumnIndex, e.RowIndex].Style = style;
如果您需要取消选择已选择的单元格,那么您可以使用以下代码。如果单击选定的单元格,它会取消选择。
private void DataMenu_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex < 0 || e.RowIndex < 0 || e.RowIndex == dataMenu.NewRowIndex)
{
return;
}
var cell = dataMenu[e.ColumnIndex, e.RowIndex];
if (cell.HasStyle)
{
cell.Style = null;
}
else
{
var style = new DataGridViewCellStyle(dataMenu.DefaultCellStyle)
{
BackColor = Color.CornflowerBlue
};
style.SelectionBackColor = style.BackColor;
style.SelectionForeColor = style.ForeColor;
cell.Style = style;
for (int i = 0; i < dataMenu.RowCount; i++)
{
if (i != e.RowIndex)
{
dataMenu[e.ColumnIndex, i].Style = null;
}
}
}
}