C#dataGridView控件如何在当前环境中使用Contains包含来判断特定字符?

指定列名是"员工状态",当表中该列值对应存在 "离职"字符时,设置行底色
想问一下,如何在当前环境中使用Contains包含来判断特定字符?
求解答,谢谢!


foreach (DataGridViewRow r in dataGridView1.Rows)
            {
               if ((string)(r.Cells["员工状态"].Value) == "5_离职")
                    {
                        r.DefaultCellStyle.ForeColor = Color.Red;
                    }
                }

                //以下命令无效
                //if (r.Cells["员工状态"].ToString().Contains("离职"))
                //{
                //    r.DefaultCellStyle.ForeColor = Color.Red;
                //}
            }
if (r.Cells["员工状态"].Value.ToString().Contains("离职"))试看

你调试过 r.Cells["员工状态"].ToString() 的值吗?

有尝试过,因初学对多窗体切换无法有效跟踪调试,放弃了。
当前也只是尝试,结果不成功,想找能成功的表述语句。

先判断是否为null,不为null再判断是否包含

已确认过该列所有行均有值,非空值。
#1处上半部分用等于办法是成功的。
现只是想要找包含的办法,因为用处更大。

当前就是不知道怎么回事啊。
先确认一下:
 if (r.Cells["员工状态"].Value.ToString().Contains("离职"))
这个表达式是否正确?

原始语句
if ((string)(r.Cells["员工状态"].Value) == "5_离职")
遇到Null值时会直接报错的。当前运行时没有出错。

我们通常在bind时让微软自己处理,而不是自己循环

你可以在RowPostPaint,CellFormart这类事件里处理

比如 CellFormatting
 private void dgvResult_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    //在这里直接判定是不是想要列,值是什么,如果列和值都符合条件,修改 e.CellSytle
}换个方式试看能否取到有效值
.Rows[1].Cells[1].Value

换个方式试看能否取到有效值:.Rows[1].Cells[列++].Value

随便在项目里摘一段代码,当然这个代码只是修改了当前Cell,如果要修改整行可以自己修改

     private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.RowIndex > -1)
            {
                if (e.Value == null)
                    return;
                if (e.ColumnIndex == 5 || e.ColumnIndex == 6 || e.ColumnIndex == 7 || e.ColumnIndex == 8)
                {
                    bool tes = (bool)e.Value;
                    e.Value = tes ? "开" : "关";
                    e.CellStyle.BackColor = tes ? Color.LawnGreen : Color.Yellow;
                }

                if (e.ColumnIndex == 1)
                {
                    int temp = (int)e.Value;
                    if (temp > 0)
                    {
                        Enum.TryParse(temp.ToString(), out var dayOfWeek);
                        e.Value = dayOfWeek;
                    }
                }
            }
        }

有报错:
“System.Windows.Forms.DataGridViewRow”不包含“Rows”的定义,并且找不到可接受类型为 “System.Windows.Forms.DataGridViewRow”的第一个参数的扩展方法“Rows”(是否缺少 using 指令或程序 集引用?)

基本查错都不会么,报错时把鼠标一个一个移到变量上面,看哪个值为null了

要取值在第几列就写第几列的序号r.Cells[?]

如下能取到单元格的值不?只要能取到单元格的值就能用包含判断。
dataGridView1.Rows[1].Cells[列++].Value
超纲?完全不会的,从net1.1微软第一次把net折腾出来的时候,第一本红宝书,第一次msdn讲dgv的时候就是这样。
也就是第一本微软的教程就这么写的,你说他超纲?现在你的写法,其实是XX园时代留下的印记,因为当年很多人是asp,vb过来的,他把asp,vb年代做法搬过来了(有时候属于迫不得已,资料少,又要急着完成,在烂的实现也是实现)

上午要开会,乘着等开会的时间,3分钟写个(这次选择RowPrePaint事件,实际上很多事件都可以完成这件事)

  private void Form2_Load(object sender, EventArgs e)
        {
            List lst = new List();
            lst.Add(new MyClass());
            lst.Add(new MyClass()
            {
                age = 18,name = "木子李"
            });
            lst.Add(new MyClass()
            {
                age = 18,name = "赵日天"
            });
           

            dataGridView1.RowPrePaint += DataGridView1_RowPrePaint;
            dataGridView1.DataSource = lst;
        }

        private void DataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
        {
            if (e.RowIndex > -1)
            {
                MyClass data = dataGridView1.Rows[e.RowIndex].DataBoundItem as MyClass;
                if ((data.name??"").IndexOf("李")>-1)
                {
                    dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
                }
            }
        }

如果你不想通过注册事件来完成,我认为你需要好好检查一下DataGridViewRow 和DataGridViewCell的值,这俩肯定有一个是null值,建议你把表格的界面发上来看一下,我觉得是你r.Cell[""]的问题

if(r.Cells[7].Value.ToString().Contains("离职"))
这个用法试过,怕自己数错,也用过8,都是一样的报错。

我之前做過類似的判斷, 我不知道你的儲存格格式下拉選單(combobox)還是文字(text)
我判斷的是數字大小,用迴圈判斷每一個row的Cells["totalprice"]
如果都是"5_離職"的話,看是否完全符合就直接 == 判斷就好, 如果是不是特殊字元的話可以加@"5_離職"

***你可以確認一下,Cells["XXXX"] 裡面打的是不是ColumnName ; 而不是text的內容

for (int i = 0; i < dataGridView1.Rows.Count; i++) 
                {
                    if (int.Parse(dataGridView1.Rows[i].Cells["totalprice"].Value.ToString()) < int.Parse(mintotal.Text)) 
                    {
                        dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.Coral;
                    }
                    else if (int.Parse(dataGridView1.Rows[i].Cells["totalprice"].Value.ToString()) > int.Parse(maxtotal.Text))
                    {
                        dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.DeepSkyBlue;
                    }
                    else 
                    {
                        dataGridView1.Rows[i].DefaultCellStyle.BackColor = Color.White;
                    }
                }

可以套用,谢谢!!!
这样一来,我又有两个问题想问一下:
1、下列中的 if (!(r.Cells["员工状态"].Value is System.DBNull))
www.9iBee.com不应该是完成了空值的判断了吗?
之前在别的查询表里,那个列存在很多空值,用#1的法子是可行的。一换成Contains就出现问题。
在这里已反复确认不存在空白值,怎么就用不了了?

//满足特定条件的行记录字体、颜色修改
            foreach (DataGridViewRow r in dataGridView1.Rows)
            {
                if (!(r.Cells["员工状态"].Value is System.DBNull))//当字段值不为空时,有效。2020.04.02
                {
                    if ((string)(r.Cells["员工状态"].Value) == "5_离职")
                    {

 

2、我的每个查询后面都搭配上了dateGridView条件


            //dataGridView1设置
            dataGridView1.AllowUserToAddRows = false;//禁止最后一行空白
            dataGridView1.AllowUserToDeleteRows = false;//禁用delete键的删除功能
            dataGridView1.ReadOnly = true;//禁用单元格编辑功能
这个禁止最后一行空白,也不能解决null的问题吗?

这样一来,我又有两个问题想问一下:
1、下列中的 if (!(r.Cells["员工状态"].Value is System.DBNull))不应该是完成了空值的判断了吗?
之前在别的查询表里,那个列存在很多空值,用#1的法子是可行的。一换成Contains就出现问题。
在这里已反复确认不存在空白值,怎么就用不了了?

 

你可能感兴趣的:(C#dataGridView控件如何在当前环境中使用Contains包含来判断特定字符?)