none
請問GridView中某一個欄位值要根據不同條件來變換其顏色有什麼比較好的做法?

    問題

  • 假設GridView一共有5個欄位﹐在第三個欄位我要根據不同的顯示值來變更顯示的顏色﹐我目前的做法是在GridView的DataBound事件中撰寫

    protected void GridView1_DataBound(object sender, EventArgs e) {
        for (int i = 0; i < GridView1.Rows.Count; i++) {
          if (GridView1.Rows[ i ].Cells[2].Text.ToString() == "未發佈") {
            GridView1.Rows[ i ].Cells[2].ForeColor = System.Drawing.Color.Red;
          } else {
            GridView1.Rows[ i ].Cells[2].ForeColor = System.Drawing.Color.Black;
          }
        }
    }

    可是這樣子做﹐如果未來我在GridView上增減欄位﹐我必須去特別注意cell的位置﹐可能要跟著異動這段程式碼﹐另外﹐如果我要判斷的值是來自於別的欄位﹐也要特別去算cell的位置﹐總之對於未來的維護上都有困擾。

    能不能用類似 dt.RowsIdea["欄位名稱"].ToString() 這樣子的型式來判斷呢?
    或者有其它比較好的做法呢?

    2006年11月17日 上午 09:50

解答

  • 那就是要在 RowDataBound 中把 DataSource 中的 DataRow 取出來了 .

    剛好我也用 C#,所以我會寫這樣的程式碼(有一個限制,就是 DataSource 要是 DataTable):

        protected void ShopBrowser_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                DataRow row = ((DataRowView)e.Row.DataItem).Row;

                .....
            }
        }

    然後,用 row.Table.Columns 就可以取得 DataColumn 的集合,接下來就不必再說了吧

    2006年11月17日 上午 10:29
    版主

所有回覆

  • 我比較喜歡用 RowDataBound,這樣一定可以處理到每一個 GridViewRow,但你要先判斷 RowType 是不是 DataRow,不然會處理到 Header/Footer...

    至於你的第二個問題,你可以透過 GridView.Columns 來取得 DataSourceField 的集合,也就是 GridView 的欄位,然後再去抓取你要的欄位 index(可以用迴圈去判斷 HeaderText).

    我並不喜歡在 GridView 上設 AutoGenerateColumns="true",那樣雖然方便,但是無法隨心所欲的變換樣式或資料,想要夠好的延展性,自己在寫程式時還是辛苦一點,懶少偷一點吧,不然以後光就 maintain 就累死人了 .

    2006年11月17日 上午 10:18
    版主
  • 當我改寫成 GridView1.RowsIdea.Cells["欄位名稱"].Text.ToString()
    這樣一開始編譯就錯了

    最符合的多載方法 'System.Web.UI.WebControls.TableCellCollection.this[int]' 有一些無效的引數
    引數 '1': 無法從 'string' 轉換為 'int'

     

    2006年11月17日 上午 10:18
  • 請問小朱

    用迴圈去判斷 Header Text是怎麼做?我就不想直接使用index值。

    另外﹐我的GridView 的Header Text都是自定的﹐也就是AutoGenerateColumns="false"﹐那麼如果只能判斷Header Text是不是就沒辦法去比對沒有加在GridView上的欄位了?(我指的是有select出來的欄位﹐但沒有在GridView上顯示出來)

    2006年11月17日 上午 10:25
  • 那就是要在 RowDataBound 中把 DataSource 中的 DataRow 取出來了 .

    剛好我也用 C#,所以我會寫這樣的程式碼(有一個限制,就是 DataSource 要是 DataTable):

        protected void ShopBrowser_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                DataRow row = ((DataRowView)e.Row.DataItem).Row;

                .....
            }
        }

    然後,用 row.Table.Columns 就可以取得 DataColumn 的集合,接下來就不必再說了吧

    2006年11月17日 上午 10:29
    版主