作者:小木 一直以來都比較偏愛DataList一點。因爲這傢伙的發佈格式比Repeater好一點,自定制的靈活度又比DataGrid好一點。但是這個笨蛋居然沒有翻頁功能!kao,難道使用DataList的用戶會只有十來條數據,一頁就可以顯示清楚的嗎?? 不想自己給DataList去做翻頁,所以這一週就研究了一下DataGrid。基本上來講這傢伙也很笨,但是總算是搞清楚怎麽用它了。那先從數據綁定寫起。 總是有一些基礎的東西要先鋪墊一下。說實話,我以前也就是用,沒有仔細總結。基本來講,數據綁定有兩種情況: 1 、單值數據綁定:用於需要把一個值綁定到某控件上(廢話)。例如要設置一個控件的某個屬性。語法就是: <% # property_name %> ,當然也可以使用server的方法: <% # method_name(para1, para2....) %> ,或者使用表達式: <% # expression %> 。 比如,我要在頁面上某個server的Label里顯示當前用戶的名稱。那我可以寫一個方法public string GetName()然後return一個從session或者其他什麽裏面讀到的用戶的名字。然後在aspx文件的Label代碼里寫:Text = " <%# GetName()%> " ,然後對應的地方就會顯示名字了。 什麽,你沒有顯示?啊sorry,我忘記講要DataBind()了!可以只調用綁定了數值的控件的DataBind(),如果很多也可以使用Page的DataBind()就全部都包括進去了。 那上面的例子我也看到過這樣的寫法: <%= GetName() %> 這個應該不叫做數據綁定阿,他是寫在頁面上客戶端控件里的,比如 < td ></ td > 或者 < span ></ span > 標簽裏面,也不需要DataBind()。.NET會把server拿到的值直接放到頁面上對應的地方去。 2 、重復值數據綁定:用於數據源包含多個值的情況。例如要把列表、集合或行集綁定到一個可以顯示多個值的控件上。專門為服務器短數據綁定設計的8個控件是:HTML < select > , ASP:ListBox, ASP:DropDownList, ASP:CheckBoxList, ASP:RadioButtonList, ASP:Repeater, ASP:DataList, ASP:DataGrid。可綁定的數據源包括:Collection(如Request.Form中的集合、DataSet的Tables集合中表的集合、或自己創建和填充的集合), ArrayList(哈哈,這是我最喜歡用的東西,因爲蝦米都可以往它裏面放!汗), HashTable, DataView, DataSet, DataReader。 這些控件裏面,如果控件支持模版,那麽好辦拉,創建和定義好模版就行了。如果不支持,可以在運行時設置控件屬性,動態的將數據源中的字段賦予給該控件的屬性。我想應該就是指DataTextField和DataValueField這些屬性吧! 那多值綁定的話語法比較簡單的就是 <% # Container.DataItem( " field_name " ) %> 了。但是我通常沒有辦法使用它,因爲我討厭把DataTable這樣的東西在UI層里賦來賦去的。通常我喜歡自己在Model定義一個對象,然後在DataAccess層去讀取數據庫,拿到的DataTable或者DataRow等sql對應的對象就直接傳給BusinessLogic,然後BusinessLogic就把它做成Model裏面我自己定義的對象,返回給UI層。這也就是爲什麽我會最常用ArrayList了。這樣寫UI的程序員可以不用管數據庫里的表怎樣設計的,他只要看Model的代碼,拿他想要的東西就行了。這個時候就要使用這個語法的變形了,因爲DataGrid或者其他控件可不知道我的Model裏面怎樣定義的: <% # DataBinder.Eval(Container.DataItem, property_name) %> 哇卡卡卡,我愛死Eval了,不管我給他什麽object,他都能把那個object中我指定的property拿出來,盡量的顯示成文本。而且你還可以格式化,例如隨便從我最近寫好的一個文檔里copy一句出來是這樣: <% # ((DateTime)(DataBinder.Eval(Container.DataItem, vwProjects_Info.c_strSQLCOL_VWPROJECTS_DT_DATE))).ToString(System.Configuration.ConfigurationSettings.AppSettings[ " DateFormat " ]) %> 解釋一下,vwProjects_Info就是我自己根據數據庫里一個叫做vwProjects的視圖做的一個類。這個視圖有一個字段是DateTime型,名字叫做dt_date。那我的這個類就會有一個成員叫做c_strSQLCOL_VWPROJECTS_DT_DATE,就是對應與這個字段。如此一來,UI的程序員(雖然這個例子里的視圖和頁面都是我自己做 ^^ b)就可以不用知道數據庫里視圖是怎樣子,他只要這樣寫,各個對應於這個視圖里的各條紀錄的對象就綁定到這個DataGrid的各個Item上面了。然後我把它轉換成DateTime型,最後用ToString()把它格式化。格式參數是我在webconfig文件里定義的: < add key = " DateFormat " value = " MM'/'dd'/'yyyy " /> 。這樣做只是爲了保證所有的頁面上風格可以統一。 我手頭一本參考書這樣總結使用Eval的情況的: * 數據源中的各行或列表項包含多個值(多個列或字段)時; * 要使用不同於綁定控件的對象作爲值的源時; * 要格式化要顯示的值時; 基本上第2個我不太用...例如不要使用Container里綁定到這個item的DataItem,而另外指定一個對象的某行某列的值,大概就是這樣子。這好像有點像在多值綁定裏面去嵌了一個單值綁定。 (續)