当前位置: 首页 > news >正文

ASP.NET DEMO Ⅳ : 使用数据源控件将数据绑定到 ListControl 上

目的:

1. 展示 ListControl.AppendDataBoundItems 属性用法

2. 展示使用数据源控件绑定联动 ListControl

3.出发点:

      a. 今天 csdn 还有网友问,DropDownList 绑定数据后能否插入额外项?答案当然是肯定的。

      b. 昨天 forums.asp.net中有人使用数据源控件绑定两个联动DRP,设置第二个DRPAppendDataBoundItems=true,绑定数据后将出现重复数据。

      c. 自己学习下数据源绑定控件——用ASP.NET 2.0 一年了,基本还没实践性的操练过数据源控件,总存有疑虑——如此,傻瓜式的东东能上得了台面?

提示:

1. ASP.NET 2.0 为列表型控件基类 ListControl 提供了AppendDataBoundItems 属性,该值指示是否在绑定数据之前清除已  存在的列表项。默认值为 false。然而,只要你设置 AppendDataBoundItems=true,无论何时执行数据绑定(首次加载或者回发页面),都不会清除原有数据,而是将绑定数据追加上去。因此,如果我们希望每次绑定数据,插入自己的静态项(如常见的“选择全部”),而且希望在任意位置插入,还是只有手动实现。如果使用数据源控件绑定数据,那么需要选择正确的插入静态项时机。下面我们将展示,数据源绑定控件和手动绑定如何加入自定义额外项。

关于这个问题,早期 scott 在他的blog上做了讨论:

ListControl.AppendDataBoundItems Property in ASP.NET 2.0

2. 继承自 ListControl  的控件包括 BulletedList, CheckBoxList, DropDownList, ListBox, RadioButtonList

所有这些控件用法基本一致,这里我们以 DropDownList (DRP)为例。

3.示例由两个DRP组成,第一个DRP数据来自Northwind的Categories表,第二个DRP展示当前选择的Category的Product。

4.数据源控件包括AccessDataSource, SqlDataSource,ObjectDataSource,XmlDataSource,提供访问不同类型的数据源,如数据库、XML 文件或中间层业务对象。这里我们选择使用SqlDataSource。常规用法,我们都很熟悉,使用配置数据源向导,一路鼠标+回车,数据库中数据就展示在我们面前。

然而,这里我们希望为Category下来框增加一项“Select All”,以便能列出所有的Product。该模型SQL是通常是这样实现的,即如果参数 @CategoryID IS NULL,我们就返回所有的Product

SELECT [ProductID], [ProductName] FROM [Products] WHERE (@CategoryID IS NULL OR [CategoryID] = @CategoryID)

因此,我们希望SqlDataSource的过滤参数(由Parameter 类的扩展类表示)能接受或者将某个预定值自动将转化为 DBNull,非常幸运,Parameter确实为我们提供了 ConvertEmptyStringToNull 属性以指示是否将空字符串转换为null。默认值为true。

然而,SqlDataSource还公开了一个开关项属性 CancelSelectOnNullParameter,该属性指示当 SqlDataSource的 SelectParameters 集合中包含任何一个参数为空引用时,是否取消数据检索操作。默认值为true。因此,为实现我们的示例,我们需要将其设置为false。

5.现在我们再来看下AppendDataBoundItems 的用法,首先设置 drpCategory.AppendDataBoundItems=True,然后手动添加了一个静态项,text="Select ALL" 而 value="",就像前面所述,SqlDataSource使用的过滤参数(这里是ControlParameter)会自动将其转换为null。

drp1_thumb%5B9%5D.jpg
   1: <asp:DropDownList ID="drpCategory" runat="server" AppendDataBoundItems="True"
   2:             AutoPostBack="True" DataSourceID="dsCategory" DataTextField="CategoryName"
   3:             DataValueField="CategoryID">
   4:             <asp:ListItem Value="">Select All</asp:ListItem>
   5:         </asp:DropDownList>

对于drpProduct 呢?如果我们依葫芦画瓢:

   1: <asp:DropDownList ID="drpProduct" runat="server" DataSourceID="dsProduct" AppendDataBoundItems="true" 
   2:            DataTextField="ProductName" DataValueField="ProductID">
   3:            <asp:ListItem Value="">Please select a product</asp:ListItem>
   4:        </asp:DropDownList>

选择第二次选择Category后我们将得到重复的Product列表:

drp2_thumb%5B2%5D.jpg

因此,我们只有另择他法。回忆 ASP.NET 1.x 我们是如何处理的呢?

   1: void drpCategory_SelectedIndexChagned(object sender, EventArgs e)
   2:    {
   3:        int selectedCategoryId = -1;
   4:        // ...
   5:        // 
   6:        drpProduct.DataSource = BindProductByCategory(selectedCategoryId);
   7:        drpProduct.DataBind();
   8:  
   9:        ListItem item = new ListItem("Please select a product", "");
  10:        drpProduct.Items.Insert(0, item);        
  11:    }

然而,由于我们将数据绑定完全委托给数据源控件处理,我们应该在哪里添加我们额外项呢?答案是 ListControl 的 DataBound 事件!该事件在执行数据绑定之后触发。

   1: void drpProduct_DataBound(object sender, EventArgs e)
   2:     {
   3:         ListItem item = new ListItem("Please select a product", "");
   4:         //drpProduct.Items.Add(item);
   5:         // u can insert the All item to Items at the specified index location,
   6:         // such as zero
   7:         drpProduct.Items.Insert(0, item);
   8:         // u can set the All as the selected item.
   9:         //drpProduct.SelectedIndex = drpProduct.Items.Count - 1; 
  10:     }

 完整代码:

   1: <%@ Page Language="C#" AutoEventWireup="true" %>
   2:  
   3: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
   4:  
   5: <script runat="server">
   1:  
   2:     void Page_Load(Object sender, EventArgs e)
   3:     {
   4:         
   5:     }
   6:  
   7:     void Page_PreRender(object sender, EventArgs e)
   8:     {
   9:         
  10:     }
  11:  
  12:     void drpProduct_DataBound(object sender, EventArgs e)
  13:     {
  14:         ListItem item = new ListItem("Please select a product", "");
  15:         //drpProduct.Items.Add(item);
  16:         // u can insert the All item to Items at the specified index location,
  17:         // such as zero
  18:         drpProduct.Items.Insert(0, item);
  19:         // u can set the All as the selected item.
  20:         //drpProduct.SelectedIndex = drpProduct.Items.Count - 1; 
  21:     }
  22:     
  23:     protected void dsProduct_Selected(object sender, SqlDataSourceStatusEventArgs e)
  24:     {
  25:  
  26:     }
</ script >
   6:  
   7: <html xmlns="http://www.w3.org/1999/xhtml" >
   8: <head runat="server">
   9:     <title>活用 ListControl.AppendDataBoundItems 属性</title>
  10: </head>
  11: <body>
  12:     <form id="form1" runat="server">
  13:     <h2 style="text-align:center;">活用 ListControl.AppendDataBoundItems 属性</h2>    
  14:     <div>
  15:         Category:
  16:         <asp:DropDownList ID="drpCategory" runat="server" AppendDataBoundItems="True"
  17:             AutoPostBack="True" DataSourceID="dsCategory" DataTextField="CategoryName"
  18:             DataValueField="CategoryID">
  19:             <asp:ListItem Value="">Select All</asp:ListItem>
  20:         </asp:DropDownList>
  21:         <asp:SqlDataSource ID="dsCategory" runat="server" ConnectionString="Data Source=.;Initial Catalog=Northwind;Integrated Security=True"
  22:             ProviderName="System.Data.SqlClient" SelectCommand="SELECT [CategoryID], [CategoryName] FROM [Categories]">
  23:         </asp:SqlDataSource>
  24:         Product:
  25:         <asp:DropDownList ID="drpProduct" runat="server" DataSourceID="dsProduct" OnDataBound="drpProduct_DataBound" 
  26:             DataTextField="ProductName" DataValueField="ProductID">
  27:         </asp:DropDownList>
  28:         <asp:SqlDataSource ID="dsProduct" runat="server" ConnectionString="Data Source=.;Initial Catalog=Northwind;Integrated Security=True"
  29:             ProviderName="System.Data.SqlClient" CancelSelectOnNullParameter="false" SelectCommand="SELECT [ProductID], [ProductName] FROM [Products] WHERE (@CategoryID IS NULL OR [CategoryID] = @CategoryID)" OnSelected="dsProduct_Selected">
  30:             <SelectParameters>
  31:                 <asp:ControlParameter ControlID="drpCategory" Name="CategoryID" ConvertEmptyStringToNull="true"
  32:                     PropertyName="SelectedValue" Type="Int32" />
  33:             </SelectParameters>
  34:         </asp:SqlDataSource>
  35:         <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="Please select a product" ControlToValidate="drpProduct" Display="Dynamic"></asp:RequiredFieldValidator>
  36:         <asp:Button ID="btnPostBackTest" Text="PostBack Test" runat="server" />
  37:     </div>
  38:     </form>
  39: </body>
  40: </html>
下载

相关文章:

  • java synth实例
  • 心理年龄测试:准专业的心理年龄鉴定测试
  • Linux 文件系统
  • Asp.net连接Oracle数据库的连接池问题(ZT)
  • 创业者要殷勤巴结的几类人
  • [ACM] hdu 1201 18岁生日
  • prototype.js 1.4版开发者手册
  • 前端日志分析
  • 微信打疼的不只是马云
  • 一个很好的php分词类库
  • 科隆2外挂源代码(VB)
  • Unity3D插件分享
  • MyEclipse 4.1、4.2 GA 破解程序
  • php+jquery+ajax无刷新图片上传裁切,模拟flash头像上传实例
  • MS SQL入门基础:声明游标
  • 深入了解以太坊
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • co.js - 让异步代码同步化
  • Docker容器管理
  • echarts花样作死的坑
  • EOS是什么
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • hadoop集群管理系统搭建规划说明
  • java小心机(3)| 浅析finalize()
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • linux学习笔记
  • Mysql优化
  • Python socket服务器端、客户端传送信息
  • Python打包系统简单入门
  • vue 配置sass、scss全局变量
  • Vue2.0 实现互斥
  • vuex 学习笔记 01
  • Vue官网教程学习过程中值得记录的一些事情
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 聊聊flink的TableFactory
  • 扑朔迷离的属性和特性【彻底弄清】
  • 如何学习JavaEE,项目又该如何做?
  • 什么是Javascript函数节流?
  • 使用putty远程连接linux
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 微信小程序填坑清单
  • 线性表及其算法(java实现)
  • 消息队列系列二(IOT中消息队列的应用)
  • 一起参Ember.js讨论、问答社区。
  • ionic入门之数据绑定显示-1
  • MPAndroidChart 教程:Y轴 YAxis
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • ​520就是要宠粉,你的心头书我买单
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • # 计算机视觉入门
  • #QT 笔记一
  • (8)STL算法之替换
  • (C++17) std算法之执行策略 execution