Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 更改单元格的背景色不会';t在表格'中工作;s构造函数_C#_.net_Winforms_Data Binding_Datagridview - Fatal编程技术网

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
的单元格和行所做的更改(在form
Load
事件之前)将不会持久化,它们将丢失。不仅仅是样式,而是行和单元格的所有更改

事实上,加载后看到的列和行并不是在构造函数中看到的列和行

简短的回答(如前所述)是您应该在表单的
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您的代码将无法工作,因为您正在调用此