[ASP.NET]GridView的Row.Cells[ColumnIndex]如何改用ColumnName來使用

  • 28668
  • 0
  • 2009-09-14

[ASP.NET]GridView的Row.Cells[ColumnIndex]如何改用ColumnName來使用

有用過DataGrid的人,一定記得之前是可以直接讀取Cell(string ColumnName)的。

這個東西,在GridView卻消失了,e.Row.Cells[int ColumnIndex],只能用Index去取得欄位的位置。

這在程式需求變動頻繁或需要合併儲存格、合併Grid Header等,用index算是相當麻煩的,往往多一個Column,index調到手軟,還會miss。

 

所以,這個需求其實在大專案開發還是蠻有必要設計的。

可惜的是,似乎沒找到直接拓展Cells()的方式,(好想設計成多載啊~~~~)

網路上與MS論壇,幾乎都是額外用function轉,當然效率一定是比較差的,但一個Grid的Columns正常來講應該不多,

效率與維護成本一比,恩,還是寫個function來得好用一點。

 

這邊提供兩個版本,前提都是ColumnName不能有重複的,function我是直接設計在GridView裡面。

不想寫在GridView裡面的,就把this改成自己的GridView的ID即可。

  1. 針對BoundField的DataField屬性,缺點是只有BoundField能用。
  2. 
            /// <summary>
            /// Gets the index of the datafield column name matched.
            /// </summary>
            /// <param name="DataColumnName">Name of the data column.</param>
            /// <returns></returns>
            public int GetDataFieldColumnIndex( string DataColumnName)
            {
                DataControlFieldCollection Columns = this.Columns;
                int columnIndex = -1;
                foreach (DataControlField field in Columns)
                {
                    if (field is System.Web.UI.WebControls.BoundField)
                    {
                        if (((BoundField)field).DataField == DataColumnName)
                        {
                            columnIndex = Columns.IndexOf(field);
                        }
                    }
                }
    
                return columnIndex;
            }
  3. 針對Column的HeaderText屬性,優點是即使不是BoundField,仍能讀取到該欄。缺點是可能會有中文,或是HeaderText如果是動態或多國語言,有點麻煩。
  4. 
            /// <summary>
            /// Gets the index of the headertext column name matched.
            /// </summary>
            /// <param name="columnHeaderText">The column headertext.</param>
            /// <returns></returns>
            public int GetHeaderTextColumnIndex(string columnHeaderText)
            {
    
                foreach (DataControlField column in this.Columns)
                {
    
                    if (column.HeaderText == columnHeaderText)
                    {
    
                        int columnID = this.Columns.IndexOf(column);
    
                        return columnID;
                    }
    
                }
                return -1;
            }
    使用方式舉例:Value為我的第二欄DataField。
    
        protected void Button1_Click(object sender, EventArgs e)
        {
            this.Button1.Text = this.JoeyGridView1.Rows[1].Cells[this.JoeyGridView1.GetDataFieldColumnIndex("Value")].Text;
        }

 

[註1]2009/02/03,補上魔法學院jeff大大正規的作法:擷取 GridView 資料列的欄位值集合

MSDN對DataControlField.ExtractValuesFromCell的說明


或許您會對下列培訓課程感興趣:

  1. 2021/1/9:【針對遺留代碼加入單元測試的藝術】202101 - 台北
  2. 2021/1/10:【極速開發+】 202101 台北
  3. 2021/2/20~2021/2/21:【演化式設計】測試驅動開發與持續重構 202102

想收到第一手公開培訓課程資訊,或想詢問企業內訓、顧問、教練、諮詢服務的,請洽 Facebook 粉絲專頁:91敏捷開發之路