web前端

位置:IT落伍者 >> web前端 >> 浏览文章

使用XML为列表控件绑定数据


发布日期:2022年08月26日
 
使用XML为列表控件绑定数据

了解使用XML为列表控件绑定数据的各种不同的方法

介绍

在web开发项目中我们需要经常写一些代码从数据源读取动态数据到列表控件中在经典ASP时期这是一件相对比较困难的任务例如我们必须查询数据库找回 RecordSet 并且在手动创建HTML标签时还要重述 RecordSet

现在在ASPNET中你做同样的事情有了更好的办法此外除了用数据库作为数据源你还可以使用各种数据源比如XML文件哪一个更好呢?这会在性能适应性可靠性易配置性安全等方面引起争论在这里我不想讨论这些

这篇文章讨论了几种可选择的办法给列表控件绑定不同类型的数据源(主要是XML文件)尽管我们使用ListBox 作为例子但你可以很容易地把这种技术扩展到其他从 SystemWebUIWebControlsListControl 类继承而来的列表控件它们包括 CheckBoxList DropDownList 和 RadioButtonList

硬编码列表框

作为开始让我们回忆一下通常我们是怎样用HTML定义一个列表框 (ListBox) 的下面展示了一个列表框的原始代码这是最简单的方法且费用最少但是缺少一些弹性来控制列表框的行为

<select size= id=lstPizzaTopping>

<option value=supreme>Supreme</option>

<option value=italianclassic>Italian Classic</option>

<option value=meatlover>Meat Lover</option>

</select>

在ASPNET中你可以使用列表框得到同样的结果但是具有更多性能来控制它的行为和属性

<asp:listbox rows= id=lstPizzaTopping runat=server>

<asp:listitem value=supreme>Supreme</asp:listitem>

<asp:listitem value=italianclassic>Italian Classic</asp:listitem>

<asp:listitem value=meatlover>Meat Lover</asp:listitem>

</asp:listbox>

让我们在代码中使用一点手法除了在列表框中硬编码进去一些项你可以使用ListItem 对象生成一些项添加到列表框控件中ListItem 有两个参数项的文字以及值如果你没指定第二个参数那项的值将跟它的文字一样下面的代码演示了该怎么做

<script runat=server>

Sub Page_Load(src as Object e as EventArgs)

lstPizzaToppingItemsAdd(new ListItem(Supreme supreme))

lstPizzaToppingItemsAdd(new ListItem(Italian Classic italianclassic))

lstPizzaToppingItemsAdd(new ListItem(Meat Lover meatlover))

</script>

<asp:listbox rows= id=lstPizzaTopping runat=server />

列表框绑定数据

事实上ASPNET允许你把列表框的内容跟对象绑定起来这个对象可以是一个数组一个集合对象一个数据库甚至是一个XML文件下面的例子演示了怎么把一个字符串数组绑定到列表框控件上我们将在后面更详细地探究XML数据的绑定

<script runat=server>

Sub Page_Load(src as Object e as EventArgs)

Dim arrPizzaTopping as String() = _

{ Supreme Italian Classic Meat Lover }

lstPizzaToppingDataSource = arrPizzaTopping

lstPizzaToppingDataBind()

End Sub

</script>

<asp:listbox rows= id=lstPizzaTopping runat=server />

如果我们给数组添加一个新的元素会怎么样?列表框会反映出结果吗?不会的除非你再一次使用 DataBind 方法利用这种数据绑定技术在什么时候什么地方更新列表框你拥有完全的控制权

让我们看看另外一个例子在ASPNET中用 ArrayList 对象绑定数据这个 ArrayList 跟VB中的数组有点相似但是它功能更强它能支持更多复杂的数据类型ArrayList d实际上是一个集合所以我们可以把它作为一个集合添加一个新项我们调用 Add 方法并提供对象去 Add在这种情况下它是一个字符串

<script runat=server>

Sub Page_Load(src as Object e as EventArgs)

Dim arrPizzaTopping as new ArrayList()

arrPizzaToppingAdd(Supreme)

arrPizzaToppingAdd(Italian Classic)

arrPizzaToppingAdd(Meat Lover)

lstPizzaToppingDataSource = arrPizzaTopping

lstPizzaToppingDataBind()

End Sub

</script>

<asp:listbox rows= id=lstPizzaTopping runat=server />

数据绑定是把脚本跟用户界面分离开来的一个例子(比如HTML代码)但是像我们上面提到的数据绑定技术我们只能绑定静态数据(这些数据应该被硬编码进我们的aspx 文件) 如果数据是动态将会怎么样?如果我们想在其他页面重用列表框又会怎么样?为了解决这些问题我们需要依赖于额外的数据源典型的我们使用数据库把列表框中的内容存储在表中有很多文章以及讨论了这种技术举例来说你可以查阅Scott Mitchell 关于用Access数据库为列表控件绑定数据的文章

关于数据库的讲了很多现在我们试着使用一下另一种方法——XML文件XML文件是一个纯文本文件所以你可以很容易地用记事本创建和编辑它下面的代码块是包含提供给列表框控件数据的XML文件的一个例子它有两个部分这由注释很清晰地标识出来第一部分包含了关于pizza toppings的列表第二部分包含了关于pizza crust的列表每一部分有多个条目在每一条目中又有 <value> 和 <desc> 两个元素请记住这个XML文件只是一个例子你能定义你自己的元素和内容好像你已经饿了但是别抱怨我无论如何 pizza 和编程是非常匹配的

<?xml version= standalone=yes ?>

<lookup>

<! START OF: Topping >

<topping>

<value>supreme</value>

<desc>Supreme</desc>

</topping>

<topping>

<value>italianclassic</value>

<desc>Italian Classic</desc>

</topping>

<topping>

<value>meatlover</value>

<desc>Meat Lover</desc>

</topping>

<! END OF: Topping >

<! START OF: Crust >

<crust>

<value>original</value>

<desc>Original Crust</desc>

</crust>

<crust>

<value>handstretched</value>

<desc>HandStretched Crust</desc>

</crust>

<crust>

<value>pan</value>

<desc>Pan Crust</desc>

</crust>

<! END OF: Crust >

</lookup>

现在开始变魔术了在这个XML文件中没有什么特别的除非你把它加载到ADONET的DataSet中ADONET 强有力地支持XML它可以在XML文件上建立一个关系信息举各例子提供前面提到的那个XML文件ADONET将自动创建一个名为lookup的DataSet它包含两张表tooping和crust表tooping有两列(value和desc)三行同样的表crust也有(value和desc)三行ADONET是通过模式来读和构造这些表的下面的图形象的表示了DataSet 和它的 DataTable

为了把XML文家加载到DataSet 中你要使用下面的代码第一行创建了一个新的 DataSet 实例 第二行调用了ReadXml 方法并把XML文件的完整路径传递过去我们使用 ServerMapPath 把文件的虚拟路径转换成物理路径

Dim myDataSet as DataSet = New DataSet

myDataSetReadXml(ServerMapPath(lookupxml))

把表绑定到列表框是简单的我们仅仅设置一下列表框的DataSource 和 DataMember 属性使其指向特定的表然后调用DataBind 方法就可以了别忘了设置 DataTextField 和 DataValueField 属性它们显示哪一列是作为值来使用哪一列是作为文本来使用因为ASPNET是不能自动决定的!

<script runat=server>

Sub Page_Load(src as Object e as EventArgs)

lstPizzaToppingDataSource = myDataSet

lstPizzaToppingDataMember = topping

lstPizzaToppingDataBind()

End Sub

</script>

<asp:listbox rows=

id=lstPizzaTopping

datatextfield=desc

datavaluefield=value

runat=server />

在列表框中排序

有时候你想要顺序的排列你的项下面的代码演示了这种情况第一行创建了一个表 topping的缺省视图名为myDataView 的实例第二行把sort 属性设置为desc ASC让desc列中的数据升序排列下一行我们把列表框的 DataSource属性设置为 myDatView然后调用 DataBind方法有效地传递列表框的内容

Dim myDataView as DataView = myDataSetTables(topping)DefaultView

myDataViewSort = desc ASC

lstPizzaToppingDataSource = myDataView

lstPizzaToppingDataBind()

性能问题

因为数据绑定是一个损耗资源的过程所以你应该只在你需要的时候绑定列表控件你应该在列表控件的内容是动态时或者在要故意重用列表控件时绑定数据后者比如同样一个列表框在多个页面显示当你需要改变这些列表框的内容时你会节省很多时间因为你不需要一个个去修改如果没有一个原因适合你为了避免不必要的开支你可以硬编码列表控件的内容

在列表框中排列项也是需要耗费一定的资源如果你想要列表框在任何地方任何时间都是排列号的考虑用排列好的顺序编写XML文件而不是在编程时排列列表框中的项

结论

这篇文章介绍了在web页面上处理列表控件的各种方式它从简单易懂的硬编码技术开始使用 arrayArrayList 绑定数据最后使用XML来绑定数据用XML绑定数据是一种你可以考虑代替数据库的数据绑定方法它很容易实现而且能避免SQL数据库给企业带来的高额费用

上一篇:根据数据库生成xml二法

下一篇:正则表达式删除指定的HTML 标签