关于改变DataGridView的行背景色(WinForm)

时间:2022-03-14 00:43:07
关于改变DataGridView的行背景色(WinForm)

如何根据数据源的某一列改变DataGridView的行背景色。
(这一列并不在界面上显示。)

12 个解决方案

#1


private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
   //若本行不为空行并且无物料名称则显示灰色
   if (dataGridView1.Rows[e.RowIndex].Cell["abcd"].Value=="Text1")
      dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Gray;
   else
      dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;
}

#2


不显示,没什么关系

private   void   dataGridView1_RowPrePaint(object   sender,   DataGridViewRowPrePaintEventArgs   e)
                {
                        if   (e.RowIndex   > =   dataGridView1.Rows.Count   -   1)
                                return;
                        DataGridViewRow   dgr   =   dataGridView1.Rows[e.RowIndex];
                        try
                        {
                                if   (dgr.Cells[ "列名 "].Value.ToString()   ==   "比较值 ")
                                {
                                        dgr.DefaultCellStyle.ForeColor   =   设置的颜色;
                                }
                        }
                        catch   (Exception   ex)
                        {
                                MessageBox.Show(ex.Message);
                        }
                } 

#3


引用 1 楼  的回复:
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
   //若本行不为空行并且无物料名称则显示灰色
   if (dataGridView1.Rows[e.RowIndex].Cell["abcd"].Value=="Text1")
      dataGri……


哥们,我说了,判定列“abcd”并不在界面上显示。
所以,无法使用“if (dataGridView1.Rows[e.RowIndex].Cell["abcd"].Value=="Text1")”这样的判断。

#4


引用 2 楼  的回复:
不显示,没什么关系
C# code

private   void   dataGridView1_RowPrePaint(object   sender,   DataGridViewRowPrePaintEventArgs   e)
                {
                        if   (e.RowIndex   > =   dataGridVie……


你的意思是,把那列绑定到Grid上,然后设置Visible=false,是这个意思吧。
可是如果连绑定也不允许呢。
就是想通过数据源判断怎么做?

还有啊,Grid上显示的是通过主从关系绑定的内容,单纯靠行的索引值从数据源中取,好像也不行。

#5


你把那列掩藏不就可以了,,显不显示并没关系   

     private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            try
            {
                if (dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString()=="2")
                {
                        e.CellStyle.BackColor = Color.Red;
                }
            }

#6


引用 3 楼  的回复:
引用 1 楼 的回复:

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
//若本行不为空行并且无物料名称则显示灰色
if (dataGridView1.Rows[e.RowIndex].Cell["abcd"].Value=="Text1")
dataG……

这一列虽然不显示,但是你依然可以使用它的值啊,除了该列的Visible设为false以外,其他的没有任何区别

#7


我明白了,就是说没什么办法从数据源中取数据了,只能绑定到Grid上,然后设置其Visible=false这一招了。

#8


引用 7 楼  的回复:
我明白了,就是说没什么办法从数据源中取数据了,只能绑定到Grid上,然后设置其Visible=false这一招了。

如果是 DataSource 赋值的,在 RowPrePaint 事件里转换 DataSource 取出不显示列的值

#9


引用 8 楼  的回复:
引用 7 楼  的回复:

我明白了,就是说没什么办法从数据源中取数据了,只能绑定到Grid上,然后设置其Visible=false这一招了。

如果是 DataSource 赋值的,在 RowPrePaint 事件里转换 DataSource 取出不显示列的值


不好意思,不太明白。
“在 RowPrePaint 事件里转换 DataSource 取出不显示列的值”
这里指的是把谁转换成DataSource?

#10


引用 9 楼  的回复:
引用 8 楼 的回复:

引用 7 楼 的回复:

我明白了,就是说没什么办法从数据源中取数据了,只能绑定到Grid上,然后设置其Visible=false这一招了。

如果是 DataSource 赋值的,在 RowPrePaint 事件里转换 DataSource 取出不显示列的值


不好意思,不太明白。
“在 RowPrePaint 事件里转换 DataSource 取……

假如里赋值是一个 DataTable,可以在 RowsAdded 事件中处理
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
    DataTable dtbl = (DataTable)dataGridView1.DataSource;
    for (int i = e.RowIndex; i < e.RowIndex + e.RowCount; i++)
    {
        DataGridViewRow dgvrw = dataGridView1.Rows[i];
        DataRow drw = dtbl.Rows[i];
        dgvrw.DefaultCellStyle.BackColor = 根据 drw 中某一列的值设置颜色;
    }
}

#11


问题已经解决:

            for (int i = 0; i < mainGrid.Rows.Count; i++)
            {
                 DataRow row = (mainGrid.Rows[i].DataBoundItem as DataRowView).Row;
                if (row == null)
                    return;

                ....
            }

#12


支持楼上大侠的呢
支持

#1


private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
   //若本行不为空行并且无物料名称则显示灰色
   if (dataGridView1.Rows[e.RowIndex].Cell["abcd"].Value=="Text1")
      dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Gray;
   else
      dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;
}

#2


不显示,没什么关系

private   void   dataGridView1_RowPrePaint(object   sender,   DataGridViewRowPrePaintEventArgs   e)
                {
                        if   (e.RowIndex   > =   dataGridView1.Rows.Count   -   1)
                                return;
                        DataGridViewRow   dgr   =   dataGridView1.Rows[e.RowIndex];
                        try
                        {
                                if   (dgr.Cells[ "列名 "].Value.ToString()   ==   "比较值 ")
                                {
                                        dgr.DefaultCellStyle.ForeColor   =   设置的颜色;
                                }
                        }
                        catch   (Exception   ex)
                        {
                                MessageBox.Show(ex.Message);
                        }
                } 

#3


引用 1 楼  的回复:
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
   //若本行不为空行并且无物料名称则显示灰色
   if (dataGridView1.Rows[e.RowIndex].Cell["abcd"].Value=="Text1")
      dataGri……


哥们,我说了,判定列“abcd”并不在界面上显示。
所以,无法使用“if (dataGridView1.Rows[e.RowIndex].Cell["abcd"].Value=="Text1")”这样的判断。

#4


引用 2 楼  的回复:
不显示,没什么关系
C# code

private   void   dataGridView1_RowPrePaint(object   sender,   DataGridViewRowPrePaintEventArgs   e)
                {
                        if   (e.RowIndex   > =   dataGridVie……


你的意思是,把那列绑定到Grid上,然后设置Visible=false,是这个意思吧。
可是如果连绑定也不允许呢。
就是想通过数据源判断怎么做?

还有啊,Grid上显示的是通过主从关系绑定的内容,单纯靠行的索引值从数据源中取,好像也不行。

#5


你把那列掩藏不就可以了,,显不显示并没关系   

     private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            try
            {
                if (dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString()=="2")
                {
                        e.CellStyle.BackColor = Color.Red;
                }
            }

#6


引用 3 楼  的回复:
引用 1 楼 的回复:

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
//若本行不为空行并且无物料名称则显示灰色
if (dataGridView1.Rows[e.RowIndex].Cell["abcd"].Value=="Text1")
dataG……

这一列虽然不显示,但是你依然可以使用它的值啊,除了该列的Visible设为false以外,其他的没有任何区别

#7


我明白了,就是说没什么办法从数据源中取数据了,只能绑定到Grid上,然后设置其Visible=false这一招了。

#8


引用 7 楼  的回复:
我明白了,就是说没什么办法从数据源中取数据了,只能绑定到Grid上,然后设置其Visible=false这一招了。

如果是 DataSource 赋值的,在 RowPrePaint 事件里转换 DataSource 取出不显示列的值

#9


引用 8 楼  的回复:
引用 7 楼  的回复:

我明白了,就是说没什么办法从数据源中取数据了,只能绑定到Grid上,然后设置其Visible=false这一招了。

如果是 DataSource 赋值的,在 RowPrePaint 事件里转换 DataSource 取出不显示列的值


不好意思,不太明白。
“在 RowPrePaint 事件里转换 DataSource 取出不显示列的值”
这里指的是把谁转换成DataSource?

#10


引用 9 楼  的回复:
引用 8 楼 的回复:

引用 7 楼 的回复:

我明白了,就是说没什么办法从数据源中取数据了,只能绑定到Grid上,然后设置其Visible=false这一招了。

如果是 DataSource 赋值的,在 RowPrePaint 事件里转换 DataSource 取出不显示列的值


不好意思,不太明白。
“在 RowPrePaint 事件里转换 DataSource 取……

假如里赋值是一个 DataTable,可以在 RowsAdded 事件中处理
private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
    DataTable dtbl = (DataTable)dataGridView1.DataSource;
    for (int i = e.RowIndex; i < e.RowIndex + e.RowCount; i++)
    {
        DataGridViewRow dgvrw = dataGridView1.Rows[i];
        DataRow drw = dtbl.Rows[i];
        dgvrw.DefaultCellStyle.BackColor = 根据 drw 中某一列的值设置颜色;
    }
}

#11


问题已经解决:

            for (int i = 0; i < mainGrid.Rows.Count; i++)
            {
                 DataRow row = (mainGrid.Rows[i].DataBoundItem as DataRowView).Row;
                if (row == null)
                    return;

                ....
            }

#12


支持楼上大侠的呢
支持