[匯入]一個較優雅的GridView隱藏列取值解決方案

來源:互聯網
上載者:User

在Asp.net 2.0中增加了一個新的資料繫結控制項:GridView,其目的用來取代Asp.net1.x中的DataGrid控制項,但有一點很不爽的是,如果把某列設定為visible=false,則不會進行資料繫結,也就是說無法直接從GridView中取到這個列內的文本。
這一功能在DataGrid時代幾乎是必須的,在對列表進行批量選中操作時非常有用(比如大量刪除),隱藏列通常用於儲存DataGrid行對應資料記錄的關鍵字的值,而現在在GridView中卻行不通,著實令一大批人頭疼不已,網上也有了其解決方案,其中一個如下,其原理是在行建立時設定其css樣式為不可見,這樣可以避免直接設定列的visible=false帶來的資料不綁定問題:

void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
{
 //讓索引為0的列不可見,實際上是產生的css代碼
 e.Row.Cells[0].Visible = false;
 //other code if neccecary
}

個人認為此方法不夠優雅,Asp.net 1.x年代本人就盡量避免使用事件,寧可在資料來源DataTable中做迴圈遍曆來進行一些或煩或簡的處理。一來因為vs2003對web標準支援欠佳,而我習慣於在Html源碼模式下工作,所以為DataGrid添加一個事件是極其麻煩的事情;二來因為其效能我也不大放心,畢竟每一行都要觸發一次事件。因而在GridView中仍然不喜歡事件,而且即使vs2005對web標準的支援大大改善,但添加一個事件容易,刪除一個事件還是要在兩個檔案中進行手動刪除才能同步,比較麻煩。

就事論事,回到標題,現提供我對這個問題的解決方案,基本思想仍然是用css使得儲存格不可見,而不妨礙它的資料繫結,但我的方法卻不需要在cs檔案中多加一行代碼,其思路如下:
(1)設定一個css類:

 .hidden { display:none;}

在web標準橫行的現在,我想為每個aspx連結一個common.css是基本的素質,呵呵
(2)隨後在GridView的列編輯對話方塊中,對需要進行隱藏的列進行設定,分別設定FootStyle,HeaderStyle,ItemStyle的CssClass屬性為“hidden”
Ok,這樣我們就實現了隱藏列的目的,同時又能保證對其進行資料繫結。

好了,看到這裡,如果你有所收穫,並很高興的馬上趕回去,為你的GridView添加此設定,避免了使用事件來隱藏列,並實現了大量刪除的功能。那你就大錯特錯了,呵呵
很可惜的是,在網上看到很多人關於GridView的這個功能的討論,很大一部分人都是為了這個功能而來的。

是的,在DataGrid中,要實現這個功能,隱藏列來儲存索引值是必須的,甚至是一個初學者需要摸索才能知道的技巧。然而現在GridView是用來替代DataGrid的,微軟所作的考慮更加周全。針對DataGrid無法提供行主鍵的問題,它提供了兩個全新的屬性:DataKeys和DataKeyNames!其SDK中的描述如下:
DataKeyNames:擷取或設定一個數組,該數組包含了顯示在 GridView 控制項中的項的主鍵欄位的名稱。
DataKeys:擷取一個 DataKey 對象集合,這些對象表示 GridView 控制項中的每一行的資料索引值。

看到這裡,也許你會有所明白,針對批量選中操作的問題,我們有了新的方案,現在來看一個簡單的實現,假設主鍵欄位是id:

//設定主鍵欄位名稱數組,可以多個欄位,
//你也可以在設計器中直接設定主鍵欄位,多個欄位用逗號隔開
GridView1.DataKeyNames = new string[] { "id" }; 

這樣,當進行資料繫結時,GridView會自動用索引值填充DataKeys集合,從而在綁定或者回傳後可以通過DataKeys集合來擷取某一行的索引值,例如假設想擷取第i行的id索引值,其代碼如下:

//擷取第i行的id索引值,注意該索引即行的索引,從header到footer都算在內
string id=GridViews1.DataKeys[i]["id"].ToString();
//通過索引值對資料進行處理……

由此可見,GridView提供了新的機制來綁定額外的資料到每一行。這使得可以完全放棄原來DataGrid通過隱藏列來綁定索引值的做法,顯然,現在的方案要優雅的多。當然,如果你實在需要在GridView中使用隱藏列並能夠進行取值,我上面的方法不防一試,雖然我很難想到有這樣的需求^_^

小小小程式員 2007-04-11 17:35 發表評論

文章來源:http://www.cnblogs.com/greateast/archive/2007/04/11/709273.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.