关于DataGrid Web控件的热门问题__连载之六

编辑模式下显示一个 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 ”(类别)字段,编辑项模板中的静态项定义高亮显示。

 1<asp:templatecolumn headertext="genre">
 2<itemtemplate>
 3<asp:label id="Label4" runat="server" text='```
 4# DataBinder.Eval(Container, "DataItem.genre") 
 5```'>
 6</asp:label>
 7</itemtemplate>
 8<edititemtemplate>
 9<asp:dropdownlist id="DropDownList2" runat="server" width="172px">
10<asp:listitem value="fiction">fiction</asp:listitem>
11<asp:listitem value="biography">biography</asp:listitem>
12<asp:listitem value="reference">reference</asp:listitem>
13</asp:dropdownlist>
14</edititemtemplate>
15</asp:templatecolumn>

l DataSet
如果你想要在 Drop-Down List 中显示的数据处于一个 DataSet 里,那么你可以采用通用的数据绑定方式。下面是它的声明语法。 Drop-Down List 绑定了数据集 DsBooks1 中的类别表。数据绑定的设置高亮显示。

 1<asp:templatecolumn headertext="genre (dataset)">
 2<itemtemplate>
 3<asp:label id="Label3" runat="server" text='```
 4# DataBinder.Eval(Container, "DataItem.genre") 
 5```'>
 6</asp:label>
 7</itemtemplate>
 8<edititemtemplate>
 9<asp:dropdownlist datamember="Genre" datasource="```
10# DsBooks1 
11```" datatextfield="genre" datavaluefield="genre" id="DropDownList4" runat="server" width="160px">
12</asp:dropdownlist>
13</edititemtemplate>
14</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 属性进行设置,需要你自己来确定这些属性,使它们与你在代码中创建的成员名字相匹配。

 1<asp:templatecolumn headertext="genre (database)">
 2<itemtemplate>
 3<asp:label id="Label1" runat="server" text='```
 4# DataBinder.Eval(Container, "DataItem.genre") 
 5```'>
 6</asp:label>
 7</itemtemplate>
 8<edititemtemplate>
 9<asp:dropdownlist datamember="Genre" datasource="```
10# GetGenreTable() 
11```" datatextfield="genre" datavaluefield="genre" id="DropDownList1" runat="server" width="120px">
12</asp:dropdownlist>
13</edititemtemplate>
14</asp:templatecolumn>

(Unfinished)

Published At
Categories with Web编程
Tagged with
comments powered by Disqus