1

SQL Server 2008 データベースのストアド プロシージャから読み取る GridView コントロールがあり、特定のセルに特定のテキストが含まれている行の背景色を変更しようとしています。何らかの理由で、私が思いついたソリューションは、GridView に複数の行がある場合にのみ機能します。GridView に行が 1 つしかない場合、その行の行の色は変更されません。必要に応じてさらにコードを投稿しOnRowDataBound ますが、GridView コントロールのイベントを使用しています。

OnRowDataBoundイベントのc#

 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    for (int i = 0; i < GridView1.Rows.Count; i++)
    {
        //in every row I would like to check the text of the second cell
        if (GridView1.Rows[i].Cells[1].Text == "C6N")
        {
            e.Row.BackColor = System.Drawing.Color.Red;

        }
    }

}

GridView コントロールの構造は次のとおりです。

columnName1   column1Desc   columnName2   column2Desc
one           C6N           two           zzz

目的は、column1Desc が等しい場合に GridView の行の色を変更することです。C6N

以下は、GridView をバインドするボタン クリックです。その下if(rdr.HasRows)で応答オブジェクトに書き込みましたが、実際には C6N の正しい値を出力していますが、結果セットが 1 行のみの場合、書式設定の変更は行われません。

protected void Button2_Click(object sender, EventArgs e)
    {
        //craete the drugString variable
        string drugString = string.Join(string.Empty,druglist.ToArray()).TrimEnd(',');

        //create the connection string
        string cs = ConfigurationManager.ConnectionStrings["dbcs"].ConnectionString;
        //create the connection object 
        using (SqlConnection con = new SqlConnection(cs))
        {
            //create the command object
            using (SqlCommand cmd = new SqlCommand("spMakeTempTable2", con))
            {
                //don't forget to open the connection
                con.Open();
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@drugList", drugString);
                SqlDataReader rdr = cmd.ExecuteReader();
                GridView1.DataSource = rdr;
                GridView1.DataBind();
                if (rdr.HasRows)
                    Response.Write(GridView1.Rows[0].Cells[1].Text);
                //this line prints to the screen as it should
                else
                    Response.Write("There were no drug combinations present");
            } 

        }
4

1 に答える 1

3

まず第一に、このメソッドはすべての行で呼び出されるため、グリッドビューの行をループする必要はありません。

このメソッドを呼び出し、GridViewRowEventArgsプロパティを介して情報を渡したので、クエリする行は既にわかっています。

したがって、次のようなものがより適している可能性があります。

GridView1_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
    // you only want to check DataRow type, and not headers, footers etc.
    if (e.Row.RowType == DataControlRowType.DataRow) {
            // you already know you're looking at this row, so check your cell text
        if (e.Row.Cells(1).Text == "C6N") {
            e.Row.BackColor = System.Drawing.Color.Red;
        }
    }
}

また、チェックしているテキストを格納するためにテンプレートを使用していますか? もしそうなら、テキスト以外Cell(1).Textのあらゆる種類のものを返すため、テキストが含まれているというコントロールを取得する必要があるためです。

EG ラベルにテキストがある場合は、代わりにこれを使用して、ラベルのテキストを確認してください

Label lbl = (Label)e.Row.FindControl("myTextLabel");

if (lbl.Text == "C6N") {
    e.Row.BackColor = System.Drawing.Color.Red;
}
于 2013-05-28T18:53:02.753 に答える