根据c#中的单元格内容设置单个单元格背景颜色

本文关键字:单元格 设置 单个 背景 颜色 根据 | 更新日期: 2023-09-27 18:20:26

我对c#没有经验,我正试图根据网格视图单元格的内容更改其背景色。我希望同一行中的多个单元格可以是不同的颜色。网格视图生成良好,但未应用颜色。我使用以下方法,并在创建网格视图时调用它:

protected void cell_Color()
{
    for (int r = 0; r < gv.Rows.Count; r++)
    {
        for (int c = 0; c < gv.Columns.Count; c++)
        {
            switch (gv.Rows[r].Cells[c].Text)
            {
                case "A+":
                    gv.Rows[r].Cells[c].BackColor = Color.FromArgb(0, 255, 0);
                    break;
                case "A":
                    gv.Rows[r].Cells[c].BackColor = Color.FromArgb(100, 255, 100);
                    break;
                case "B":
                    gv.Rows[r].Cells[c].BackColor = Color.FromArgb(0, 0, 255);
                    break;
                case "C":
                    gv.Rows[r].Cells[c].BackColor = Color.FromArgb(255, 255, 25);
                    break;
                case "D":
                    gv.Rows[r].Cells[c].BackColor = Color.FromArgb(128, 64, 0);
                    break;
                case "F":
                    gv.Rows[r].Cells[c].BackColor = Color.FromArgb(255, 0, 0);
                    break;
            }
        }
    }
}

第1版:谢谢你的帮助。我发现单元格没有更新的一个原因是网格视图中的某些内容阻止了精确匹配。由于我找不到它是什么,所以我只是为我要找的东西制作了字符串,并使用字符串.control检查它们是否为真。这帮助我找到了匹配项,但它只是更新了第一列。我使用的是自动生成的列,所以我不能使用gv.columns.count,所以我只选择了12列,因为这是我在gridview中使用的最多的列。代码现在看起来像

protected void RowDataBound(Object sender, GridViewRowEventArgs e)
{
    string sAplus = "A+";
    string sA = "A";
    string sB = "B";
    string sC = "C";
    string sD = "D";
    string sF = "F";
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        for (int r = 1; r <= gv.Rows.Count; r++)
        {
            if (e.Row.RowIndex == r)
            {
                string grade = e.Row.Cells[0].Text;
                bool bAplus = grade.Contains(sAplus);
                bool bA = grade.Contains(sA);
                bool bB = grade.Contains(sB);
                bool bC = grade.Contains(sC);
                bool bD = grade.Contains(sD);
                bool bF = grade.Contains(sF);
                if (bAplus == true)
                    e.Row.Cells[0].BackColor = Color.FromArgb(0, 255, 0);
                if (bA == true)
                    e.Row.Cells[0].BackColor = Color.FromArgb(100, 255, 100);
                if (bB == true)
                    e.Row.Cells[0].BackColor = Color.FromArgb(0, 0, 255);
                if (bC == true)
                    e.Row.Cells[0].BackColor = Color.FromArgb(255, 255, 25);
                if (bD == true)
                    e.Row.Cells[0].BackColor = Color.FromArgb(128, 64, 0);
                if (bF == true)
                    e.Row.Cells[0].BackColor = Color.FromArgb(255, 0, 0);
            }
        }
    }
}

因为我使用的是自动生成的列,所以如果我尝试为Cells生成一个变量并像这样循环for(int c=0;c>gv.Columns.Count;c++)它说指定的参数超出了有效值的范围。

根据c#中的单元格内容设置单个单元格背景颜色

在PreRender上调用函数
到那时,页面上的所有控件都已创建并填充了内容
它是进行与数据相关的颜色决策的最佳场所。

生成网格视图时,可以使用RowDataBound事件设置不同的颜色。

在标记中启用RowDataBound事件。

<asp:GridView ID="gridview1" runat="server" OnRowDataBound="RowDataBound">

将此代码写入code-behind文件:

protected void RowDataBound(Object sender, GridViewRowEventArgs e)
{
    if(e.Row.RowType == DataControlRowType.DataRow)
    {
    if(e.Row.RowIndex == 0)     // This is row no.1
        if(e.Row.Cells[0].Text == "ABC")
            e.Row.Cells[0].BackColor = Color.Red;
    if(e.Row.RowIndex == 1)     // This is row no.2
        if(e.Row.Cells[0].Text == "CBA")
            e.Row.Cells[0].BackColor = Color.Green;
    }
}

在此处阅读更多:http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowdatabound.aspx

我找到了答案。我无法使用RowDataBound,我相信是因为我使用了自动生成的列,并且试图更新0以上的任何单元格都返回了错误。由于我使用了一个方法来生成网格视图,所以我更新了它,在末尾调用原始的cell_Color()方法,并使用了string.control,而不是寻找完全匹配的方法。我从第1列开始,因为我不想突出显示第一列。
protected void cell_Color()
{
    string sAplus = "A+";
    string sA = "A";
    string sB = "B";
    string sC = "C";
    string sD = "D";
    string sF = "F";
    for (int r = 0; r < gv.Rows.Count; r++)
    {
        for (int c = 1; c < gv.Rows[r].Cells.Count; c++)
        {
            string grade = gv.Rows[r].Cells[c].Text;
                bool bAplus = grade.Contains(sAplus);
                bool bA = grade.Contains(sA);
                bool bB = grade.Contains(sB);
                bool bC = grade.Contains(sC);
                bool bD = grade.Contains(sD);
                bool bF = grade.Contains(sF);
                if (bAplus == true)
                    gv.Rows[r].Cells[c].BackColor = Color.FromArgb(0, 255, 0);
                if (bA == true)
                    gv.Rows[r].Cells[c].BackColor = Color.FromArgb(100, 255, 100);
                if (bB == true)
                    gv.Rows[r].Cells[c].BackColor = Color.FromArgb(0, 0, 255);
                if (bC == true)
                    gv.Rows[r].Cells[c].BackColor = Color.FromArgb(255, 255, 25);
                if (bD == true)
                    gv.Rows[r].Cells[c].BackColor = Color.FromArgb(128, 64, 0);
                if (bF == true)
                    gv.Rows[r].Cells[c].BackColor = Color.FromArgb(255, 0, 0);
            }
        }
    }
}

如果我不使用自动生成的列,我想我更喜欢使用RowDataBound。

谢谢你的帮助。