關于DataGrid Web控件的熱門問題__連載之六
2024-07-21 02:22:58
供稿:網友
編輯模式下顯示一個drop-down list
這里將提供給用戶的一個常用需求——一個某行處于編輯狀態下的drop-down list。舉例來說,一個datagrid可能顯示一個書籍清單,其中包括每本書的類別,當用戶編輯一條書籍記錄時,可能要為該書指定一個不同的類別,理想情況下,他們可以從drop-down list中選擇可能的類別值,比如“小說”、“生物”或者“參考書目”。
顯示一個drop-down list需要在datagrid中設定一個模板列。典型的情況是:項模板包含了一個控件,比如一個數據綁定的label控件來顯示記錄中某個字段的當前值。然后,向編輯項模板中添加一個drop-down list,在vs中,你可以通過datagrid的屬性生成器添加一個模板列,然后通過“編輯模板”移除編輯項模板中默認的textbox控件,并拖入一個drop-down list控件,你還可以在html視圖下添加模板列。
在創建了含有drop-down list的模板列后還有兩個任務:首先,要產生一個列表,其次要設定列表中的預選項。舉例來說,如果本書的類別設為“小說”,當drop-down list顯示時,往往需要“小說”是預選的(預選一個項并不是在所有情況下都要討論的問題)。
可以有多種生成drop-down list的方法。下面的幾個例子說明了三種方式:使用靜態項;使用dataset中的記錄集合;使用datareader直接從數據庫中讀取信息。
l 靜態項:在drop-down list中顯示靜態項不需要綁定數據到控件。你可以很簡單地在控件的項集合中定義項。在vs中,可以通過屬性窗口中的items屬性觸發項集合編輯器,也可以在html視圖中編輯項。
下面是一個顯示模式下顯示類別的模板列和編輯模式下類別的靜態列表的完整定義。項模板包含了一個label控件,其text屬性被設置為當前記錄的“genre”(類別)字段,編輯項模板中的靜態項定義高亮顯示。
<asp:templatecolumn headertext="genre">
<itemtemplate>
<asp:label id=label4 runat="server"
text=’<%# databinder.eval(container, "dataitem.genre") %>’>
</asp:label>
</itemtemplate>
<edititemtemplate>
<asp:dropdownlist id="dropdownlist2" runat="server" width="172px">
<asp:listitem value="fiction">fiction</asp:listitem>
<asp:listitem value="biography">biography</asp:listitem>
<asp:listitem value="reference">reference</asp:listitem>
</asp:dropdownlist>
</edititemtemplate>
</asp:templatecolumn>
l dataset
如果你想要在drop-down list中顯示的數據處于一個dataset里,那么你可以采用通用的數據綁定方式。下面是它的聲明語法。drop-down list綁定了數據集dsbooks1中的類別表。數據綁定的設置高亮顯示。
<asp:templatecolumn headertext="genre (dataset)">
<itemtemplate>
<asp:label id=label3 runat="server"
text=’<%# databinder.eval(container, "dataitem.genre") %>’>
</asp:label>
</itemtemplate>
<edititemtemplate>
<asp:dropdownlist id=dropdownlist4 runat="server"
datasource="<%# dsbooks1 %>" datamember="genre"
datatextfield="genre" datavaluefield="genre" width="160px">
</asp:dropdownlist>
</edititemtemplate>
</asp:templatecolumn>
l datareader
你也可以直接從數據庫生成drop-down list。這種方式更為復雜但效率也更高。原因在于只有在需要的時候才去讀數據庫。
實現的一個相當簡便的方法是利用web窗體數據綁定表達式。盡管最常用的是在數據綁定表達式中調用databinder.eval 方法,但事實上你可以使用該頁任何可用的public成員。下面的例子告訴你如何創建一個函數來創建、填充以及返回一個datatable對象,drop-down list可以對它進行綁定。
這種情況下,你需要能夠執行一個能得到你需要的記錄集的數據命令。比如說,你可能需要定義一個command,并把它的commandtext屬性設為“select * from genres”。為了簡化例子,假設在頁面中已經有了一個connection對象和一個command對象。
由創建頁面中的一個共有函數開始。這個函數創建了一個datatable對象并定義了你需要的列集合。然后打開連接,執行command命令來返回一個datareader,并且遍歷datareader,復制數據到datatable,最后,將datatable作為該函數的返回值返回。
下面說明了如何實現。該例中返回的datatable中只有一列(“genre”)。通常只需要一個列來生成drop-down list。如果需要將其text和value設成不同的值,就需要兩個列。
public datatable getgenretable()
{
datatable dtgenre = new datatable();
if(application["genretable"] == null)
{
datarow dr;
datacolumn dc = new datacolumn("genre");
dtgenre.columns.add(dc);
this.sqlconnection1.open();
system.data.sqlclient.sqldatareader dreader =
this.sqlcommand1.executereader();
while(dreader.read())
{
dr = dtgenre.newrow();
dr[0] = dreader[0];
dtgenre.rows.add(dr);
}
this.sqlconnection1.close();
}
else
{
dtgenre = (datatable) application["genretable"];
}
return dtgenre;
}
注意:該函數將它創建的datatable保存于application態,由于這里的datatable就象一個靜態的查詢表,所以并不需要在每次一個不同行轉為編輯模式時都重新讀取它,而且,由于同一個datatable可以被多用戶使用,可以將其保存在全局的application態而不是保存在根據用戶不同而不同的session態。
下面是模板列的聲明,你會發現這與綁定dataset中表的語法非常相似,唯一的真正區別就是數據源的綁定調用的是你自己的函數。這種技術的稍有不利之處在于,在vs中,得不到太多的設計類型服務。由于是通過代碼定義datatable來綁定,vs不會提供任何方式來對datamember、datatextfield和datavaluefield屬性進行設置,需要你自己來確定這些屬性,使它們與你在代碼中創建的成員名字相匹配。
<asp:templatecolumn headertext="genre (database)">
<itemtemplate>
<asp:label id=label1 runat="server"
text=’<%# databinder.eval(container, "dataitem.genre") %>’>
</asp:label>
</itemtemplate>
<edititemtemplate>
<asp:dropdownlist id=dropdownlist1 runat="server"
datasource="<%# getgenretable() %>"
datamember="genre"
datatextfield="genre"
datavaluefield="genre"
width="120px">
</asp:dropdownlist>
</edititemtemplate>
</asp:templatecolumn>
(unfinished)