0

我对 c# 缺乏经验,我正在尝试根据其内容更改 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;
            }
        }
    }
}

编辑1:感谢您的帮助。我发现单元格未更新的一个原因是网格视图中的某些内容阻止了完全匹配。因为我不知道它是什么,所以我只是为我正在寻找的东西制作了字符串,并使用 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);
            }
        }
    }
}

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

4

3 回答 3

0

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

于 2013-07-01T07:10:32.293 回答
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

于 2013-07-01T07:12:34.413 回答
0

我找到了答案。我无法使用 RowDataBound,我相信是因为我使用的是自动生成的列并且尝试更新任何高于 0 的单元格都会返回错误。由于我正在使用一种方法来生成网格视图,因此我将其更新为在最后调用原始的 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。

谢谢你的帮助。

于 2013-07-02T06:29:37.783 回答