概述 在很多情况下我们都会使用到列表控件来方便用户选择一些选项例如在某网站上注册新用户时通常会询问你的性别是男还是女这时我们用单项按钮以供用户做出相应的选择还有当你填写自己的家庭地址时通常会使用到一个包含各省省名的下拉列表来供用户直接选择这样可以减少用户的输入量上述的这些单项按钮和下拉列表都在ASPNET移动程序中都是以列表控件的形式存在的我们可以使用列表控件来呈现各种形式(单项多选下拉列表)的列表以供用户选择和使用但是在ASPNET 移动开发工具包中只有三个列表控件分别为SelectionList List和ObjectList 控件虽然没有ASPNET 中那么多类型的列表控件但是我们却可以使用SelectionList List和ObjectList这三个列表控件实现单项多选等几乎所有的功能在本系列文章中将探讨这三个控件的一些基本功能和使用方法并说明这三个控件相似之处及异同点
图是SelectionList List和ObjectList三个控件在类的继承上的关系
图
上面的三个列表控件中SelectionList是最简单的但是它可以以各种不同的类型进行呈现因此具有很大的灵活度以供不同的需求使用应用的列表类型同时因为SelectionList控件不支持分页功能所以在包含多个列表项的情况下该控件就显得力不从心了还有一点要需要重点说明的是SelectionList是这三个列表控件中唯一支持多选的而且该控件还可以以下拉列表的形式进行呈现也可以以单项和多选框的方式进行呈现当然这种呈现格式必须要被移动设备上的浏览器所接受在一些WML浏览器上只支持一些特殊的呈现形式例如单项和多选按钮并不支持下拉列表这种呈现形式图演示了下拉列表在不同浏览器上呈现时所存在的差别
图 在上图所示的PocketIE浏览器上列表控件是以下拉列表的形式呈现的而在Openwave的WML浏览器上下拉列表类型的呈现形式是不支持的为此在该浏览器中是将列表中的各个列表项显示出来供用户进行相应的选择List列表控件支持分页功能这就意味着它支持列表项较多的列表它只可以以项目符号列表或编号列表的形式进行呈现(只要浏览器支持即可)除了之外其它的被SelectionList支持的列表形式(例如下拉列表)在List中均无法实现图中List列表控件就是以编号列表的形式呈现的并且支持分页功能
图 List列表控件以编号列表的形式呈现在页面上而且支持分页功能
在上述三个列表控件中最复杂的当属ObjectList 控件了SelectionList和List控件允许你使用服务器控件语法静态地声明列表项但是ObjectList控件是无法采用这种方式来添加列表项的你必须在ObjectLis列表控件与相应的数据源绑定后再通过代码将列表项添加到列表中ObjectList 控件允许一个列表项中同时显示多个字段这是其它两个控件所不具备的它们只允许每个列表项只显示一个字段的信息除此之外ObjectList 控件中的每个列表项还可以和多个命令相关联其它两个控件所不具备的功能
图 ObjectList 控件中可以在每个列表项中显示多个字段这里同时显示了球队名称输赢和积分等字段
图 每个列表项可以和多个命令进行关联页面下方的各个链接就是与列表项关联的命令你可以选择不同的命令产生不同的操作
下表概括了上述三个控件的主要功能
能力SelectionListListObjectList是否可以以下拉列表列表框 单项或多选按钮等类型在HTML浏览器上进行呈现√ 是否支持多选 √ 以项目符号列表或编号列表的形式进行呈现√ 当列表包含较多的列表项时是否可以启用分页功能√√是否可以通过服务器语法声明静态地生成列表项√√ 是否可以与数据源绑定√ √√在一个列表项中是否可以同时显示多个字段√在选择一个列表项后是否会触发相应的事件√(注释)√ √每个列表项是否可以自定义相关联的命令√是否支持模板 √ √注释SelectionList列表控件在选择一个列表项后其自身是无法自动产生一个回发(postback)操作的你必须在包含该SelectionList列表控件的Form控件上放置一个Command控件再由该Command控件将因列表选项发生改变的信息回发到服务器上这样ASPNET运行时就可以根据这些信息做出相应的处理并将处理后的信息返回到移动页面上
采用不同的方式构建列表
在开始探究每个列表控件的具体用法时我们首先来了解一下上述三个控件的共同特性SelectionList和List控件允许开发人员定义静态地定义各个列表项也就是我们可以在服务器控件语法中使用<Item>标签来定义每个列表项对应的文本信息和值信息而动态的实现方式就是通过代码创建和列表中的每个列表项对应的SystemWebUIMobileControlsMobileListItem 对象并将这些对象添加到列表控件的Items集合中由于每个列表项都是预先设置好的所有我们也称这种列表为静态列表
还有一种方式就是将列表控件与一个数据源进行绑定由于该列表控件中的所有列表项所需的文本信息和值信息都读取自数据源因此这些列表项都是根据这些信息动态生成注意上述的三个列表控件都支持数据绑定的方式动态地生成列表
静态列表的实现
前文提过我们可以通过静态的方式实现列表其实这种实现就是在服务器控件语法中使用<Item>标签来设置每个列表项所需的文本信息和值信息下面我们来通过一段代码来说明如何静态地实现一个列表程序清单是一个SelectionList控件的声明我们希望通过该列表控件来选择一个列表项在这里我们将手机的品牌和型号分别作为列表项的文本信息和值信息你可以在每个<Item>标签中使用Text属性自动文本信息使用Value属性指定值信息
程序清单
<mobile:SelectionList id=
SelectionList
runat=
server
>
<Item Text=Dopoda Value=P />
<Item Text=Motorola Value=A />
<Item Text=Nokia Value=N />
<Item Text=Samsung Value=E />
</mobile:SelectionList>
我们将在SelectionList列表控件详解这一章中通过具体的实例来应用程序清单中的代码在这只是简要地介绍下实现静态列表的方法其实我们还可以以一种可视化的方式来实现静态列表当然这要依靠Visual Studio 开发环境的支持在Visual Studio 中提供了一个非常有用的属性生成器使得你可以很方便地定义一个静态列表只要你选择列表控件的智能标签而后再选择属性生成器链接就会弹出属性生成器对话框我们可以通过该对话框以可视化的方式产生程序清单中的代码如图所示
图 我们可以在该对话框中通过创建新项按钮来产生一个新的列表项而后在这个列表项对应的项文本和值文本框处填写好列表项的文本信息和值信息就创建好了一个列表项如果你要调整各个列表项之间的次序可以点击上下箭头按钮来做出相应的调整 在属性生成器对话框的常规选项卡中用户可以选择列表控件在页面上的呈现形式例如SelectionList列表控件支持下拉列表列表框单项按钮复选按钮和多选列表框等几种形式开发人员可以根据实际的需要选择合适的类型如图所示
ASPNET运行时是通过下面所描述的方式来解析服务器控件语法中的各个列表项的在你使用静态的方式构建一个列表时ASPNET实际上是针对这个列表中的每个列表项都创建一个SystemMobileUIMobileControlsMobileListItem对象并使用<Item> 标签中的Text和Value属性指定的文本信息和值信息对相应的MobileListItem对象进行初始化而后再将初始化后的MobileListItem对象添加到一个SystemMobileUIMobileControlsMobileListItemCollection集合对象中我们可以在代码中通过SelectionList或List类的Items属性来访问这个MobileListItemCollection集合对象事实上程序清单和程序清单的功能是相同的两种方式都可以生成静态列表只不过程序清单隐藏了静态列表的底层的实现更容易操作罢了
程序清单
protected void Page_Load(object sender
EventArgs e)
{
if (!IsPostBack)
{
SelectionListItemsAdd(new MobileListItem(Dopoda P));
SelectionListItemsAdd(new MobileListItem(Motorola A));
SelectionListItemsAdd(new MobileListItem(Nokia N));
SelectionListItemsAdd(new MobileListItem(Samsung E));
}
}将列表控件与数据集合进行绑定
前文提过除了使用静态的方式定义列表外我们还可以将SelectionList List和ObjectList三个列表控件与特定的数据源进行绑定这些列表控件支持两种类型的数据源: SystemCollectionsIEnumerable和SystemComponentModelIListSourceNet Framework中的许多集合类都是实现了IEnumerator接口为此这些类都支持简单的枚举功能至于这些类的具体实例有位于SystemCollections命名空间的ArrayArrayListHashtable和ListDictionary还要一些和控件相关联的集合对象(例如前面的代码中使用到的MobileListItemCollection)如果你要查看所有实现了IEnumerator接口的集合类的话请自行参考MSDN帮助文档
你还可以将列表控件与IListSource数据集合进行绑定SystemData命名空间中的两个类实现了IListSource这种接口这两个类就是我们在ADONET中经常使用的DataSet和DataTable我们知道这两个类是相关联的因为DataSet相当于一个由多个DataTable组成的集合DataSet类是ADONET构架中的一个主要组件并且DataSet还相当于在数据库中所检索到的数据在内存中的一个缓存当列表控件的数据源为一个DataSet对象时因为一个DataSet可能包含多个DataTable对象所以我们还必须使用SelectionListDataMember属性确切地指定使用那个DataTable对象来填充列表项注意当你使用一个IEnumerator数据源时是没有必要指定DataMember属性的至于DataSet在ASPNET移动程序中的具体应用将在其它章节中进行介绍
当你需要以数据绑定的方式动态地实现一个列表的话那么应该将该列表控件的DataSource属性指定一个相关联的数据源如果数据源是一个DataSet对象的话那么还需要使用DataMember属性确切地指定用那个DataTable填充列表项对于SelectionList和List控件来说你可以使用DataTextField和DataValueField两个属性分别指定数据源中的两个字段列表控件会自动将这两个字段的内容作为各个列表项的文本信息和值信息而ObjectList列表控件是使用LabelField属性来指定数据源中的一个字段使得该字段中的内容应用到各个列表项中进行呈现至于每个列表项的其它字段内容你可以在ObjectList的详细信息视图页上进行查看
我们可以以代码的方式或服务器控件语法的方式实现上述数据绑定属性的设置例如你希望在一个SelectionList列表控件中使用Manufacturer字段作为各列表项的文本信息且Model字段作为各列表项的值信息那么其设置的方法如程序清单所示
程序清单
<mobile:SelectionList ID=SelectionList Runat=server SelectType=MultiSelectListBox DataTextField=Manufacturer DataValueField=Model>
</mobile:SelectionList>
为了获取数据源中对应字段的内容我们还需要定义一个类使得每个列表项都可以读取相应的文本信息和值信息
程序清单
public class MobileTelephone
{
private String manufacturer model;
public MobileTelephone(String manufacturer String model)
{
thismanufacturer = manufacturer;
thismodel = model;
}
public String Manufacturer { get { return thismanufacturer; } }
public String Model { get { return thismodel; } }
}
然后在Page_Load事件处理函数中创建所有的数据项并将其添加到一个ArrayList对象中最后就是设置列表控件的DataSource属性了在这里我们将DataSource指定为这个ArrayList对象完成上述的步骤再调用DataBind方法这样就将列表控件和数据源进行绑定了
程序清单
protected void Page_Load(object sender EventArgs e)
{
if (!IsPostBack)
{
ArrayList array = new ArrayList();
arrayAdd(new MobileTelephone(Dopoda P));
arrayAdd(new MobileTelephone(Motorola A));
arrayAdd(new MobileTelephone(Nokia N));
arrayAdd(new MobileTelephone(Samsung E));
SelectionListDataSource = array;
SelectionListDataBind();
}
}
使用上述代码的完整示例将在具体探讨每个列表控件时会应用到
提示DataBind方法对于数据绑定来说是至关重要的很多开发人员经常忘记调用这个方法以致列表控件不显示任何列表项我们可以使用两种方法来使用DataBind方法一种就是在每个要进行数据绑定的列表控件上单独使用DataBind方法如程序清单所示你还可以采用一种一劳永逸的方法那就是使用MobilePageDataBind方法(在程序清单中使用thisDataBind()替代 SelectionListDataBind()这里的this代表的就是MobilePage)这样在页面上存在多个数据绑定的列表控件时仅需使用一个thisDataBind()方法就可以实现所有列表控件和数据源的绑定而无需为每个实现了数据绑定的列表控件都调用一次DataBind方法