根据c#中的单元格内容设置单个单元格BackColor

时间:2013-07-01 06:56:27

标签: c# asp.net .net custom-cell

我对c#缺乏经验,我正在尝试根据内容更改gridview单元格的背景颜色。我希望同一行中的多个单元格能够成为不同的颜色。 gridview生成正常,但不应用颜色。我正在使用以下方法并在创建gridview时调用它:

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;
            }
        }
    }
}

EDIT1: 谢谢您的帮助。我发现细胞没有更新的一个原因是因为gridview中的某些东西阻止了完全匹配。因为我无法找到它是什么我只是为我正在寻找的字符串做了字符串并使用string.contain检查它们是否真实。这有助于我找到一个匹配,但它只是更新第一列。我正在使用自动生成的列,所以我不能使用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);
            }
        }
    }
}

因为我正在使用自动生成的列,如果我尝试为单元格输入变量并将其循环     for(int c = 0; c&gt; gv.Columns.Count; c ++) 它表示指定的参数超出了有效值的范围。

3 个答案:

答案 0 :(得分:0)

在PreRender上调用您的功能。
到那时,页面上的所有控件都会被创建并填充内容 这是与数据相关的颜色决策的最佳场所。

答案 1 :(得分:0)

您可以使用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

答案 2 :(得分:0)

我找到了答案。我无法使用RowDataBound,我相信因为我使用自动生成的列并尝试更新0以上的任何单元格返回错误。由于我正在使用一种方法来生成gridview,我更新了它以在最后调用原始的cell_Color()方法并使用string.contain而不是查找完全匹配。我从第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。

感谢您的帮助。