.NET中DataGrid的使用(二)DataGrid的屬性和方法


作者:小木 

怎麽講了半天還沒有提到DataGrid自己的屬性?別急別急,講完common的這就來了阿...厄,讓我先比較一下
^^

DataGrid在aspx文檔里應該怎樣去定義呢?當然你可以在AutoGenerateColulmns為True的情況下,給他數據庫查詢結果的對象作爲數據源,這時候它可以自行判斷列名和内容,並向標題行添加列名。你只要定義DataSource然後DataBind()就好了。但是這樣很笨耶,用戶的希望可常常與DB的設計不一樣。那就只好設置AutoGenerateColulmns為False,然後用
< Column > 元素定義列。所以,DataGrid是一列一列地定義,比如,第一列的Header, item, footer...然後下一列的header, item, footer..... 

比較DataList和Repeater,它們則是一行一行地定義。例如先定義第一行為Header, 描述它的每一列,然後下面的Item行,描述Item的每一列.... 

好,下面就進入DataGrid的屬性。基本上大家可以查查書或者MSDN來得知它的屬性的使用方法。汗,我沒有想偷懶...我就寫寫我自己用的時候踫到的一些問題點就好了。 

*   < Column > 元素中比較常用的控件就是  < ASP:BoundColumn > 和  < ASP:TemplateColumn > 。前者顯示綁定的數據的值,後者可以控制輸出,例如加入按鈕,讓它的Text去顯示綁定的數據的值。 

*  DataGrid自帶按列排序的功能,利用AllowSorting和OnSortCommand屬性,列名就自動變成Link的形式。但是,它只有在AutoGenerateColulmns為True的情況下才可以起作用!(所以基本上我都只能自己寫排序。)自己寫排序的話,要做的事情是:定義每一列的Header,讓它作爲LinkButton形式;定義這個Button的Click事件,注意這是 protected  void  btnColumn_Click(object sender, System.EventArgs e)。然後根據sender可以知道click的是哪個列。然後重新給DataGrid賦排序後的DataSource,接著再次綁定DataBind()。 

關於排序還有一點要講的就是,DataGrid是
" 認識 " 數據庫查詢結果的對象的。例如DataTable, DataView。而DataView有一個自帶的排序,所以如果用DataView作爲數據源,在Click事件發生的時候,要做的事情就是:取到DataView,定義排序列,賦給DataGrid的DataSource,調用DataGrid的DataBind()。而當使用Collection作爲DataSource的時候,就要在從數據庫讀取的時候進行排序。也許有人認爲因爲DataGrid可以自己做很多事情,就盡量利用,比如使用DataView作爲數據源,每次取同樣的DataView,然後定義它的排序方式,這樣很傻瓜,代碼很容易寫;但是我更加prefer自己寫排序。因爲DataGrid並沒有把它的DataSource放到ViewState裏面,而重新定義了DataView的排序方式後,一定要調用DataBind()才可以應用到DataGrid上。這樣無論哪種方法我都必須再次連接數據庫。從性能上來講,自己定義的話我可以把排序方式作爲一個參數,一直傳給我的存儲過程,讓它去做ORDER BY,然後把排序之後的查詢結果作爲DataSource。這樣肯定比去排序一個DataView要快,coding也並沒有變得複雜。 

*  FindControl也是挺常用的一個方法。因爲通過DataGrid的事件的參數可以拿到Item的Index。但通常我們要操作的是一個Item中的某個列,它的控件的值。這個時候就要使用FindControl了。它的參數是Control的ID。 

我用它的時候發生了一件事情,雖然是比較低級的錯誤,但是不仔細還真很難發現。在使用
< ASP:Label ></ ASP:Label > 的時候我習慣把顯示内容寫在這對標簽内。而不是用Text = "" 去寫。結果當我使用FindControl找到它的時候,Text怎麽讀都是 "" 。當時我鬱悶了很久,最後才發現是這個問題!暈倒,大家不要和我犯同樣的錯誤! 

*  DataKeyField 可指定為DataSource中的某一列。這樣通過Item的Index就可以拿到該Item對應的值。它的應用例如:在不想顯示Indentity Column的時候,利用它就很方便了。 

* 切換到編輯模式: 這不用講了吧,雖然很常用。定義對應的事件就好,參數是object sender, DataGridCommandEventArgs e。完了也要重新綁定。 

*  順便提一句關於DropDownList這樣的東東,除了利用DataSource, DataTextField, DataValueField 進行數據綁定,還可以用填充ListItem的方法去給它Load數據。用後者的時候是不需要DataBind()的,但是記得想重新Load數據的時候要清空原有的Items。否則DropDownList會把已Add的Items都保留的。但是使用DataBind()的時候,都只Load當前定義的DataSource。 

我很想知道能不能有辦法像填充Items方法一樣,重新DataBind()的時候還能拿到Bind之前的DataSource。如果可以,在不想改變數據,只改變排序方式或者切換到編輯模式的時候,就可以減少一次數據庫連接了。如果你知道有這樣的方法(不要使用全局變量的前提下),請寫給我。謝謝! 

(完)
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值