2

ASP.NetにGridviewがあります-C#。Assignmentまたはという名前の列が1つありますExam。その列には、課題または試験の名前があります。例:"Exam 1""Assignment 5" 課題である各行を赤、試験を青にする必要があります。

SQL Server、または私のコードでそれを行うための最良の方法は何ですか?もしそうなら、適切なコードは何ですか?

4

3 に答える 3

2

BackColor各行のプロパティを個別に設定して、Gridview の行の背景色を設定します。行のデータに基づいてこれを行うには、バインドされている行を調べる必要があります。これは、RowDataBoundイベント内で行うことができます。サーバー側イベントに接続する基本的な Gridview の簡単なマークアップを次に示します。

<asp:GridView runat="server" AutoGenerateColumns="False" OnRowDataBound="TestGridView_RowDataBound" ID="TestGridView">
    <Columns>
        <asp:BoundField DataField="Type" HeaderText="Assignment/Exam" />
        <asp:BoundField DataField="Name" HeaderText="Name" />
    </Columns>
</asp:GridView>

protected void Page_Load(object sender, EventArgs e)
{
    DataTable tests = new DataTable();
    tests.Columns.Add(new DataColumn("Type"));
    tests.Columns.Add(new DataColumn("Name"));
    tests.AcceptChanges();

    tests.Rows.Add(new []{"Assignment","StackOverflow Basics"});
    tests.Rows.Add(new[]{"Exam","Expert Markdown"});
    tests.Rows.Add(new[]{"Exam","Upvoting"});
    tests.Rows.Add(new[]{"Assignment","Rep Changes"});

    TestGridView.DataSource = tests;
    TestGridView.DataBind();
}

イベントのコードでは、バインドしている個々のデータ行を取得して値を調べることができるため、それに応じて BackColor を設定できます。

protected void TestGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    // Ignore the first row which is the header
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // Get hold of the row and then the DataRow that it's being bound to
        GridViewRow row = e.Row;
        DataRow data = ((DataRowView)row.DataItem).Row;

        // Look at the value and set the colour accordingly
        switch (data.Field<string>("Type"))
        {
            case "Assignment":
                row.BackColor = System.Drawing.Color.FromName("Blue");
                break;
            case "Exam":
                row.BackColor = System.Drawing.Color.FromName("Red");
                break;
        }
    }
}

これは問題なく機能しますが、テキストの色を白に設定して読みやすくすることも検討してください。

ただし、将来的にはさらに柔軟性が必要になる場合があります。たとえば、「ラボ」と呼ばれる緑色の 3 番目の評価タイプを追加する場合、コードを変更/再コンパイル/再テスト/再デプロイする必要があります。代わりに、データベースから名前付きの色を渡し、それを RowDataBound イベントで使用すると、その作業の一部を回避できます。

protected void TestGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    // Ignore the first row which is the header
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        // Get hold of the row and then the DataRow that it's being bound to
        GridViewRow row = e.Row;
        DataRow data = ((DataRowView)row.DataItem).Row;

        row.BackColor = System.Drawing.Color.FromName(data.Field<string>("BackColour");
        row.ForeColor = System.Drawing.Color.FromName(data.Field<string>("TextColour");
    }
}
于 2012-11-26T12:06:32.960 に答える
0

まず、変数内の行インデックスを見つけます。次のコードでは、変数としてインデックスを使用しています。

grdWithLocation.Rows[index].BackColor = Color.FromArgb(255, 238, 238, 238);
于 2012-11-26T11:54:14.437 に答える