C# 更改单元格的背景色不会';t在表格'中工作;s构造函数
我的代码看起来很简单,我不确定我遗漏了什么 我在C# 更改单元格的背景色不会';t在表格'中工作;s构造函数,c#,.net,winforms,data-binding,datagridview,C#,.net,Winforms,Data Binding,Datagridview,我的代码看起来很简单,我不确定我遗漏了什么 我在dataGridView.Rows中遍历每一行,然后遍历每个单元格并检查其值是否为“OK”,然后我将单元格颜色更改为color.Red,并在控制台中写入“if WAS TRUE” 我在控制台窗口中有一个漂亮的小“IF是真的”,只是为了向自己证明IF语句被捕获了(它是真的)。但是我的单元格颜色保持不变白色 任何建议都将不胜感激 public partial class Form1 : Form { public static BindingL
dataGridView.Rows
中遍历每一行,然后遍历每个单元格并检查其值是否为“OK”
,然后我将单元格颜色更改为color.Red
,并在控制台中写入“if WAS TRUE”
我在控制台窗口中有一个漂亮的小“IF是真的”
,只是为了向自己证明IF语句被捕获了(它是真的)。但是我的单元格颜色保持不变白色
任何建议都将不胜感激
public partial class Form1 : Form
{
public static BindingList<Record> record_list = new BindingList<Record> { };
public static DataGridViewCellStyle style = new DataGridViewCellStyle();
public Form1()
{
InitializeComponent();
FillData();
foreach (DataGridViewRow row in dataGridView.Rows)
{
for (var i = 0; i < row.Cells.Count; i++)
{
Console.WriteLine(row.Cells[i].Value);
if (row.Cells[i].Value as string == "OK")
{
row.Cells[i].Style.BackColor = Color.Red;
Console.WriteLine("IF WAS TRUE");
}
}
}
}
void FillData()
{
record_list.Add(new Record("Support-19", "TEST", 0, 0.0, "",
"LOC CODE2", 0.0, 0, 0, 0.0, ""));
record_list.Add(new Record("Support-99", "ROBOTS", 0, 0.0, "",
"OK", 0.0, 0, 0, 0.0, ""));
record_list.Add(new Record("Support-27", "TEST2", 0, 0.0, "",
"LOC CODE1", 0.0, 0, 0, 0.0, ""));
dataGridView.DataSource = record_list;
}
}
编辑:这是标记为重复,但这似乎不同于我。在另一篇文章中,它看起来像是一个单元格被直接发送到一个函数,我在这里迭代单元格。我尝试以类似的方式调用BackColor属性,但没有得到任何结果…当您尝试在窗体的构造函数中运行代码时,装饰单元格不会“粘住”。将其移动到窗体的OnLoad覆盖:
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);
foreach (DataGridViewRow row in dataGridView.Rows)
{
for (var i = 0; i < row.Cells.Count; i++)
{
Console.WriteLine(row.Cells[i].Value);
if (row.Cells[i].Value as string == "OK")
{
row.Cells[i].Style.BackColor = Color.Red;
Console.WriteLine("IF WAS TRUE");
}
}
}
}
protected override void OnLoad(事件参数e){
基础荷载(e);
foreach(dataGridView.Rows中的DataGridViewRow行)
{
对于(var i=0;i
当您尝试在表单构造函数中运行代码时,装饰单元格不会“粘住”。将其移动到窗体的OnLoad覆盖:
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);
foreach (DataGridViewRow row in dataGridView.Rows)
{
for (var i = 0; i < row.Cells.Count; i++)
{
Console.WriteLine(row.Cells[i].Value);
if (row.Cells[i].Value as string == "OK")
{
row.Cells[i].Style.BackColor = Color.Red;
Console.WriteLine("IF WAS TRUE");
}
}
}
}
protected override void OnLoad(事件参数e){
基础荷载(e);
foreach(dataGridView.Rows中的DataGridViewRow行)
{
对于(var i=0;i
您在构造函数中对DataGridView
的单元格和行所做的更改(在formLoad
事件之前)将不会持久化,它们将丢失。不仅仅是样式,而是行和单元格的所有更改
事实上,加载后看到的列和行并不是在构造函数中看到的列和行
简短的回答(如前所述)是您应该在表单的Load
事件中初始化样式但是为什么呢?
为什么您在构造函数中对DataGridView
的单元格和行所做的更改不会持续,并且会丢失?
答案是因为DataGridView
的OnBindingContextChanged
当您显示一个表单
任务序列,该序列显示一个表单
时,调用这些方法的原因是:CreateControl
→ <代码>OnBindingContextChanged。这会导致调用每个子控件的OnParentBindingContextChanged
,从而调用所有子控件的OnBindingContextChanged
现在,如果您查看一下,您将看到一个名为called的方法,该方法清除所有行和列,然后再次添加它们:
private void RefreshColumnsAndRows()
{
this.Rows.ClearInternal(false /*recreateNewRow*/);
RefreshColumns();
RefreshRows(true /*scrollIntoView*/);
}
因此,加载后看到的列和行不是构造函数中看到的列和行。它们是新对象。所以,对构造函数中的行和列所做的更改将不会持久化
动态更改样式的正确方法是什么?
虽然您可以将代码移动到
加载窗体的事件
,但动态设置行和单元格样式的一个更合适的位置是使用DtaGridView的事件在构造函数中对DataGridView的单元格和行所做的更改(在窗体加载
事件之前)不会被持久化,它们将丢失。不仅仅是样式,而是行和单元格的所有更改
事实上,加载后看到的列和行并不是在构造函数中看到的列和行
简短的回答(如前所述)是您应该在表单的Load
事件中初始化样式但是为什么呢?
为什么您在构造函数中对DataGridView
的单元格和行所做的更改不会持续,并且会丢失?
答案是因为DataGridView
的OnBindingContextChanged
当您显示一个表单
任务序列,该序列显示一个表单
时,调用这些方法的原因是:CreateControl
→ <代码>OnBindingContextChanged
。这会导致调用每个子控件的OnParentBindingContextChanged
,从而调用所有子控件的OnBindingContextChanged
现在,如果您查看一下,您将看到一个名为called的方法,该方法清除所有行和列,然后再次添加它们:
private void RefreshColumnsAndRows()
{
this.Rows.ClearInternal(false /*recreateNewRow*/);
RefreshColumns();
RefreshRows(true /*scrollIntoView*/);
}
因此,加载后看到的列和行不是构造函数中看到的列和行。它们是新对象。所以,对构造函数中的行和列所做的更改将不会持久化
动态更改样式的正确方法是什么?
虽然您可以将代码移动到加载事件窗体
,但更适合动态设置行和单元格样式的位置是使用事件DtaGridView
它们是什么类型的单元格?“你有错吗?”ShannonHolsinger不知道如何回答这个问题,我不知道它们是什么“类型”的细胞。一串而且,没有错误。只是没有颜色变化,我需要“刷新”吗?@LarsTech会的,谢谢你的建议。代码不会出错,但颜色不会更改。DataGridView具有所有不同类型的列。如果这些是文本框,最好更改文本框的背景色,而不是单元格。如果您共享代码,我们可以提供帮助。创建具体的DataGridView您的代码将无法工作,因为您正在调用此