0

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

Edit1: 助けてくれてありがとう。セルが更新されない理由の 1 つは、グリッドビュー内の何かが完全一致を妨げているためであることがわかりました。それが何であるかを見つけることができないので、探しているものの文字列を作成し、string.contain チェックを使用して、それらが真であるかどうかを確認しました。これは一致を見つけるのに役立ちましたが、最初の列のみを更新しています。私は自動生成された列を使用しているため、gv.columns.count を使用できません。代わりに、グリッドビューに使用する列が最も多いため、12 を選択しました。コードは次のようになります

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> gv.Columns.Count; c++) のようにループすると、指定された引数が範囲外だったと言われます有効な値。

4

3 に答える 3

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

私は答えを見つけました。自動生成された列を使用していて、0 を超えるセルを更新しようとするとエラーが返されたため、RowDataBound を使用できませんでした。メソッドを使用してグリッドビューを生成しているため、最後に元の 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 に答える