急!DataGridview控件如何根据某个字段值的不同,将相应行显示出不同的背景色!

时间:2021-08-25 00:45:03
急啊!

我现在在做一个小项目,有一个窗体,这个窗体中设计了一个DataGridview控件,此控件与一个数据库表连接(即与一个数据集连接),现在根据客户要求,此控件要根据数据集中某个字段值的不同,将相应的行显示为不同的背景色,如有一个标识字段,当这个字段的值为“已完成”时,此行的背景色为蓝色,为“未完成”时,显示为红色。

同时,我建立一个Timer控件,以便每隔一段时间,刷新一下这个控件,以便能即时显示已完成和未完成的记录的最新状态。

怎么实现,请各位指点。

40 个解决方案

#1


用JavaScript。

每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分

#2


循环遍历各行,再根据某列的值来手动改变行背景色

#3


不是中啊,是WINFORM程序

#4


你不是有思路了嘛,就按照这个思路进行就行 了啊,datagridview好像有提供设置行样式的属性吧,你找一下资料,这种基大概就重新绑定而已,你可以在timer事件中写入重新绑定的方法,不过我个人感觉你每隔时间去刷新数据,可能会给服务器造成一定的负担吧,如果你的需求不是要求很实时性的话,就每次点查询再刷新或者有数据变动时再刷新

#5


谢谢楼上,终于有人回复。能否讲具体点,给点代码

#6


谢谢4楼,能否给具体代码

#7


处理DataGridView的CellPainting事件就可以了。

#8


在DataGridView绑定后执行以下循环
[code]
////循环读取dataGridView1的行
foreach( DataGridViewRow dgRow i dataGridView1.Rows )
{
   ////这里假设判断第一列的值是1时,进行颜色改变的操作
    if( dgRow.Cell[ 0 ].Value.ToString() == "1" )
    {
        ////将这行的背景色设置成红色
        dgRow.DefaultCellStyle.BackColor = Color.Red;
    }
}
[#code]

#9


谢谢8楼,能否给一个非常完整的代码。我这里直接拷贝试一下。

#10


7楼能否给一个非常完整的代码,用处理DataGridView的CellPainting事件。万分感谢啊!

#11


dgRow.DefaultCellStyle.BackColor 学习!

#12


引用 2 楼 zzyhuian06142 的回复:
循环遍历各行,再根据某列的值来手动改变行背景色


顶,
在datagridview绑定完成后就可以遍历了啊,

#13


nigerenz您好,能给个具体的代码吗,

#14


private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if (e.Value != null && e.RowIndex >-1)
            {
                if (e.ColumnIndex == this.dataGridView1.Columns["你要的列"].Index)
                {
                    string strValue = e.Value.ToString();
                    switch (strValue)
                    {
                        case "0":
                            this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
                            break;
                        case "1":
                            this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Green;
                            break;
                    }
                }
            }
        }

#15


 TestInfo ti = null;
            List<TestInfo> t = new List<TestInfo>();
            for (int i = 0; i < 5; i++)
            {
                ti = new TestInfo();
                ti.GetName = "Name:" + i.ToString();
                ti.GetValue = i;
                t.Add(ti);
            }


            this.dataGridView1.DataSource = t;
这个是绑定数据库的(具体怎么绑定你一个会的)

#16


8楼都说这么详细了,你还要代码。。。。

#17


zzyhuian06142您好,我是不是要把这个

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
  {
  if (e.Value != null && e.RowIndex >-1)
  {
  if (e.ColumnIndex == this.dataGridView1.Columns["你要的列"].Index)
  {
  string strValue = e.Value.ToString();
  switch (strValue)
  {
  case "0":
  this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
  break;
  case "1":
  this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Green;
  break;
  }
  }
  }
  }

放在我的TIMER控件中,以便每次循环,都刷新一个不同行的背景色状态

#18


该回复于2010-07-27 16:10:15被版主删除

#19


引用 17 楼 tianjunfxm 的回复:
zzyhuian06142您好,我是不是要把这个

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
  {
  if (e.Value != null &amp;&amp; e.RowIndex >-1)
  {
  if (e.ColumnIndex……


这个是DataGridView的方法啊,,老大

你的Timer主要就是捞取数据,绑定数据对不对
如果是这样的话,你把Timer里面不需要写处理改变背景色的代码了

cellPainting是自绑定数据的时候,把生成cell的时候自动触发的,

#20


噢,我的Timer作用是想自动刷新满足条件的不同行的背景色,不是绑定数据用的。绑数据在一开始设计DataGridView时,就固定了,不是通过代码来绑定。

按您的意思,这个TIMER控件根本就不要,DataGridView控件会根据最新值不自动刷新不同行的背景色的,
是这样吗?

#21


对......................
回复太快,请先休息一下!

#22


要Timer做什么?

CellPainting事件在需要绘制单元格的时候就会自动触发,写好处理代码之后就是自动的了。

#23


zzyhuian06142,谢谢了!因为我了解得不太透,而这个小程序必须这两天完成,所以非常急。

#24


引用 23 楼 tianjunfxm 的回复:
zzyhuian06142,谢谢了!因为我了解得不太透,而这个小程序必须这两天完成,所以非常急。


客气了,这就是CSDN存在的价值,呵呵

#25


看出来了 挺着急

#26


最好能给个小例程,即完整代码,那就非常直观了。万分感谢啊!

#27


顺便说一句:CellPainting是在每个需要绘制的时机触发,与数据来源没有直接的关系。爱绑定就绑定,只要能够保证在事件处理方法中获得进行判断的数据即可。

#28


CellPainting是在每个需要绘制的时机触发,更不明白了,都把我说糊涂了,所以能否给个完整点代码

#29


        private void button1_Click(object sender, EventArgs e)
        {
            DataSet ds = new DataSet();
            using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("server=.;uid=sa;pwd=**;database=SuperERP"))
            {
                conn.Open();
                using (System.Data.SqlClient.SqlDataAdapter adap = new System.Data.SqlClient.SqlDataAdapter("Select * from CSDNDemo"))
                {
                    
                    try
                    {
                        ds = adap.Fill(ds, "CSDNDemo");

                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
            }

            this.dataGridView1.DataSource = ds.Tables["CSDNDemo"];
}这是绑定数据源
然后在DataGridView的CellPainting事件里面
        private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if (e.Value != null && e.RowIndex >-1)
            {
                if (e.ColumnIndex == this.dataGridView1.Columns["Status"].Index)
                {
                    string strValue = e.Value.ToString();
                    switch (strValue)
                    {
                        case "0":
                            this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
                            break;
                        case "1":
                            this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Green;
                            break;
                    }
                }
            }
        }

这样够完整了吧

#30


private void button1_Click(object sender, EventArgs e)
  {
  DataSet ds = new DataSet();
  using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("server=.;uid=sa;pwd=**;database=SuperERP"))
  {
  conn.Open();
  using (System.Data.SqlClient.SqlDataAdapter adap = new System.Data.SqlClient.SqlDataAdapter("Select * from CSDNDemo",conn))
  {
    
  try
  {
   adap.Fill(ds, "CSDNDemo");

  }
  catch (Exception ex)
  {
  throw new Exception(ex.Message);
  }
  }
  }

  this.dataGridView1.DataSource = ds.Tables["CSDNDemo"];
}这是绑定数据源
然后在DataGridView的CellPainting事件里面
  private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
  {
  if (e.Value != null && e.RowIndex >-1)
  {
  if (e.ColumnIndex == this.dataGridView1.Columns["Status"].Index)
  {
  string strValue = e.Value.ToString();
  switch (strValue)
  {
  case "0":
  this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
  break;
  case "1":
  this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Green;
  break;
  }
  }
  }
  }

再加个按钮来测试效果
        private void button6_Click(object sender, EventArgs e)
        {
            this.dataGridView1.Rows[0].Cells[1].Value = "1";
        }

#31


zzyhuian06142,非常感谢,这样直观一点。等会我来试试。有什么问题还得请教您了。

#32


谢谢各位的回复,等会试试,有问题还请大家指点。

#33


看来你是没问题了

#34


是啊   搞定了  接点分把~  

#35


引用 32 楼 tianjunfxm 的回复:
谢谢各位的回复,等会试试,有问题还请大家指点。

LZ啊,是该散点儿分了吧!

#36


把绑定数据和颜色处理写一个方法里面,难后在时间控件满足条件的时候在调用数据绑定和颜色的改变不是会好点?

#37


把绑定数据和颜色处理写一个方法里面,难后在时间控件满足条件的时候在调用数据绑定和颜色的改变不是会好点?

#38


把绑定数据和颜色处理写一个方法里面,难后在时间控件满足条件的时候在调用数据绑定和颜色的改变不是会好点?

#39


8楼很详细了啊

#40


由于你是整行变色,所以推荐使用RowPrePaint事件而不是CellPainting事件,其他的代码差不多一样

#1


用JavaScript。

每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分

#2


循环遍历各行,再根据某列的值来手动改变行背景色

#3


不是中啊,是WINFORM程序

#4


你不是有思路了嘛,就按照这个思路进行就行 了啊,datagridview好像有提供设置行样式的属性吧,你找一下资料,这种基大概就重新绑定而已,你可以在timer事件中写入重新绑定的方法,不过我个人感觉你每隔时间去刷新数据,可能会给服务器造成一定的负担吧,如果你的需求不是要求很实时性的话,就每次点查询再刷新或者有数据变动时再刷新

#5


谢谢楼上,终于有人回复。能否讲具体点,给点代码

#6


谢谢4楼,能否给具体代码

#7


处理DataGridView的CellPainting事件就可以了。

#8


在DataGridView绑定后执行以下循环
[code]
////循环读取dataGridView1的行
foreach( DataGridViewRow dgRow i dataGridView1.Rows )
{
   ////这里假设判断第一列的值是1时,进行颜色改变的操作
    if( dgRow.Cell[ 0 ].Value.ToString() == "1" )
    {
        ////将这行的背景色设置成红色
        dgRow.DefaultCellStyle.BackColor = Color.Red;
    }
}
[#code]

#9


谢谢8楼,能否给一个非常完整的代码。我这里直接拷贝试一下。

#10


7楼能否给一个非常完整的代码,用处理DataGridView的CellPainting事件。万分感谢啊!

#11


dgRow.DefaultCellStyle.BackColor 学习!

#12


引用 2 楼 zzyhuian06142 的回复:
循环遍历各行,再根据某列的值来手动改变行背景色


顶,
在datagridview绑定完成后就可以遍历了啊,

#13


nigerenz您好,能给个具体的代码吗,

#14


private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if (e.Value != null && e.RowIndex >-1)
            {
                if (e.ColumnIndex == this.dataGridView1.Columns["你要的列"].Index)
                {
                    string strValue = e.Value.ToString();
                    switch (strValue)
                    {
                        case "0":
                            this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
                            break;
                        case "1":
                            this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Green;
                            break;
                    }
                }
            }
        }

#15


 TestInfo ti = null;
            List<TestInfo> t = new List<TestInfo>();
            for (int i = 0; i < 5; i++)
            {
                ti = new TestInfo();
                ti.GetName = "Name:" + i.ToString();
                ti.GetValue = i;
                t.Add(ti);
            }


            this.dataGridView1.DataSource = t;
这个是绑定数据库的(具体怎么绑定你一个会的)

#16


8楼都说这么详细了,你还要代码。。。。

#17


zzyhuian06142您好,我是不是要把这个

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
  {
  if (e.Value != null && e.RowIndex >-1)
  {
  if (e.ColumnIndex == this.dataGridView1.Columns["你要的列"].Index)
  {
  string strValue = e.Value.ToString();
  switch (strValue)
  {
  case "0":
  this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
  break;
  case "1":
  this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Green;
  break;
  }
  }
  }
  }

放在我的TIMER控件中,以便每次循环,都刷新一个不同行的背景色状态

#18


该回复于2010-07-27 16:10:15被版主删除

#19


引用 17 楼 tianjunfxm 的回复:
zzyhuian06142您好,我是不是要把这个

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
  {
  if (e.Value != null &amp;&amp; e.RowIndex >-1)
  {
  if (e.ColumnIndex……


这个是DataGridView的方法啊,,老大

你的Timer主要就是捞取数据,绑定数据对不对
如果是这样的话,你把Timer里面不需要写处理改变背景色的代码了

cellPainting是自绑定数据的时候,把生成cell的时候自动触发的,

#20


噢,我的Timer作用是想自动刷新满足条件的不同行的背景色,不是绑定数据用的。绑数据在一开始设计DataGridView时,就固定了,不是通过代码来绑定。

按您的意思,这个TIMER控件根本就不要,DataGridView控件会根据最新值不自动刷新不同行的背景色的,
是这样吗?

#21


对......................
回复太快,请先休息一下!

#22


要Timer做什么?

CellPainting事件在需要绘制单元格的时候就会自动触发,写好处理代码之后就是自动的了。

#23


zzyhuian06142,谢谢了!因为我了解得不太透,而这个小程序必须这两天完成,所以非常急。

#24


引用 23 楼 tianjunfxm 的回复:
zzyhuian06142,谢谢了!因为我了解得不太透,而这个小程序必须这两天完成,所以非常急。


客气了,这就是CSDN存在的价值,呵呵

#25


看出来了 挺着急

#26


最好能给个小例程,即完整代码,那就非常直观了。万分感谢啊!

#27


顺便说一句:CellPainting是在每个需要绘制的时机触发,与数据来源没有直接的关系。爱绑定就绑定,只要能够保证在事件处理方法中获得进行判断的数据即可。

#28


CellPainting是在每个需要绘制的时机触发,更不明白了,都把我说糊涂了,所以能否给个完整点代码

#29


        private void button1_Click(object sender, EventArgs e)
        {
            DataSet ds = new DataSet();
            using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("server=.;uid=sa;pwd=**;database=SuperERP"))
            {
                conn.Open();
                using (System.Data.SqlClient.SqlDataAdapter adap = new System.Data.SqlClient.SqlDataAdapter("Select * from CSDNDemo"))
                {
                    
                    try
                    {
                        ds = adap.Fill(ds, "CSDNDemo");

                    }
                    catch (Exception ex)
                    {
                        throw new Exception(ex.Message);
                    }
                }
            }

            this.dataGridView1.DataSource = ds.Tables["CSDNDemo"];
}这是绑定数据源
然后在DataGridView的CellPainting事件里面
        private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if (e.Value != null && e.RowIndex >-1)
            {
                if (e.ColumnIndex == this.dataGridView1.Columns["Status"].Index)
                {
                    string strValue = e.Value.ToString();
                    switch (strValue)
                    {
                        case "0":
                            this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
                            break;
                        case "1":
                            this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Green;
                            break;
                    }
                }
            }
        }

这样够完整了吧

#30


private void button1_Click(object sender, EventArgs e)
  {
  DataSet ds = new DataSet();
  using (System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection("server=.;uid=sa;pwd=**;database=SuperERP"))
  {
  conn.Open();
  using (System.Data.SqlClient.SqlDataAdapter adap = new System.Data.SqlClient.SqlDataAdapter("Select * from CSDNDemo",conn))
  {
    
  try
  {
   adap.Fill(ds, "CSDNDemo");

  }
  catch (Exception ex)
  {
  throw new Exception(ex.Message);
  }
  }
  }

  this.dataGridView1.DataSource = ds.Tables["CSDNDemo"];
}这是绑定数据源
然后在DataGridView的CellPainting事件里面
  private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
  {
  if (e.Value != null && e.RowIndex >-1)
  {
  if (e.ColumnIndex == this.dataGridView1.Columns["Status"].Index)
  {
  string strValue = e.Value.ToString();
  switch (strValue)
  {
  case "0":
  this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
  break;
  case "1":
  this.dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Green;
  break;
  }
  }
  }
  }

再加个按钮来测试效果
        private void button6_Click(object sender, EventArgs e)
        {
            this.dataGridView1.Rows[0].Cells[1].Value = "1";
        }

#31


zzyhuian06142,非常感谢,这样直观一点。等会我来试试。有什么问题还得请教您了。

#32


谢谢各位的回复,等会试试,有问题还请大家指点。

#33


看来你是没问题了

#34


是啊   搞定了  接点分把~  

#35


引用 32 楼 tianjunfxm 的回复:
谢谢各位的回复,等会试试,有问题还请大家指点。

LZ啊,是该散点儿分了吧!

#36


把绑定数据和颜色处理写一个方法里面,难后在时间控件满足条件的时候在调用数据绑定和颜色的改变不是会好点?

#37


把绑定数据和颜色处理写一个方法里面,难后在时间控件满足条件的时候在调用数据绑定和颜色的改变不是会好点?

#38


把绑定数据和颜色处理写一个方法里面,难后在时间控件满足条件的时候在调用数据绑定和颜色的改变不是会好点?

#39


8楼很详细了啊

#40


由于你是整行变色,所以推荐使用RowPrePaint事件而不是CellPainting事件,其他的代码差不多一样