使用DataGrid动态绑定DropDownList

来源:互联网 发布:抽奖软件 内定 编辑:程序博客网 时间:2024/05/24 01:52
 

  首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才 移 动∣专 题∣SUN∣IBM∣微 软∣微 创∣精 华∣Donews∣人 邮 我的技术中心  我的分类 我的文档 全部文章 发表文章 专栏管理 使用说明
<script type="text/javascript"><!--google_ad_client = "pub-1076724771190722";google_ad_width = 125;google_ad_height = 125;google_ad_format = "125x125_as";google_ad_channel ="";//--></script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script> <iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-1076724771190722&amp;dt=1164820310078&amp;lmt=1145534508&amp;format=125x125_as&amp;output=html&amp;url=http%3A%2F%2Fdev.csdn.net%2Fdevelop%2Farticle%2F26%2F26590.shtm&amp;ref=http%3A%2F%2Fwww.google.com%2Fsearch%3Fhl%3Dzh-CN%26newwindow%3D1%26q%3D.net%2B%2B%2Bdropdownlist%2B%2Bdatagrid%26btnG%3D%25E6%2590%259C%25E7%25B4%25A2%26lr%3Dlang_zh-CN&amp;cc=229&amp;u_h=800&amp;u_w=1280&amp;u_ah=772&amp;u_aw=1280&amp;u_cd=32&amp;u_tz=480" frameborder="0" width="125" scrolling="no" height="125" allowtransparency="allowtransparency"></iframe>

 RSS 订阅  最新文档列表 Windows/.NET .NET  (rss)     Visual C++  (rss)     Delphi  (rss)     Visual Basic  (rss)     ASP  (rss)     JavaScript  (rss)     Java/Linux Java  (rss)     Perl  (rss)     综合 其他开发语言  (rss)     文件格式  (rss)     企业开发 游戏开发  (rss)     网站制作技术  (rss)     数据库 数据库开发  (rss)     软件工程 其他  (rss)    
积极原创作者  goodboy1881 (13) wangchinaking (58) iiprogram (67) fancyhf (1) harrymeng (41) yjz0065 (113) coofucoo (105) Drate (69) lphpc (30) smallnest (61)   CSDN - 文档中心 - .NET 阅读:14157   评论: 8    参与评论     标题   使用DataGrid动态绑定DropDownList     选择自 hbzxf 的 Blog 关键字   DataGrid DropDownList 出处    

使用DataGrid动态绑定DropDownList

hbzxf (阿好)
http://www.cnblogs.com/hbzxf

        简单的使用模板列绑定DropDownList,初学者想必都会了,但有时候,我们要做的就是在编辑的时候想让某一列定制为DropDownList,并且根据正常情况下显示的值自动变换DropDownList中所选的值,然后保存选择后的值到数据库或XML文件,其实要做到这样的功能并不难,只要我们学会使用DataGrid的DataGrid1_ItemDataBound事件就行了,跟我来做个例子。

        //检索数据库的函数
          public DataSet GetZcbd()
          {
            try
           {
            DataSet ds=new DataSet();   
            string searchString="select id,yy,bj from zc";
            da=new OleDbDataAdapter(searchString,conn);
            da.Fill(ds,"yy");    
             return ds;
           }
           catch
           {
            return null;    
           }  
          }

         //绑定DataGrid   
        private void BindGrid()
          {
           DataSet ds = new DataSet();
           ds = us.GetZcbd();
           if (ds!=null)
           {
            this.DataGrid1.DataSource = ds;
            this.DataGrid1.DataBind();
           }
           else
           {
            msg.Alert("加载数据错误!",Page);
           }
          }
       
        绑定好DataGrid以后,设定模板列,让其正常显示下为Label,并绑定为数据库中一ID值,在编辑状态下为DropDownList,并绑定为数据库中一Name值,我们现在要做的就是当我们选择编辑时根据Label的值自动从数据库中取出编号为ID值的姓名,并用DropDownList默认选中。(注释:为了方便大家学习,我给出一个简单代码的例子,供大家参考)

          private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
            {
             if (e.Item.ItemType == ListItemType.EditItem)
             {
                 DataRowView drv = (DataRowView)e.Item.DataItem;
              string current = drv["label1"].ToString();
              DropDownList ddl = (DropDownList)e.Item.FindControl("ddl");
              ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue(current));
             }
             if ((e.Item.ItemType == ListItemType.Item)||(e.Item.ItemType == ListItemType.AlternatingItem))  
         {
              Label t = (System.Web.UI.WebControls.Label)e.Item.FindControl("label1");
              string current = this.BindDDL(int.Parse(t.Text));
              e.Item.Cells[1].Text = current;
             }
            } 

            private string BindDDL(int ddd)
            {
             string sss = "";
             if (ddd==1)
             {
              sss="张三";
              return sss;
             }
             else
             {
                 sss="李四";
              return sss;
             }
            }

 

   注释:msg为一个类似WinForm的messagebox对话框,不必理会。可以使用label.Text代替

代码很乱,敬请谅解!

2004.4.2


作者Blog:http://blog.csdn.net/hbzxf/
相关文章
Soap 结 构 初 识 [GDI+] ColorMatrix 彩色矩阵 [GDI+]如何将一个彩色图像转换成黑白图像 [GDI+] 创建Images的两种方式 数据库中取Clob类型字段出现乱码 对该文的评论 CSDN 网友 ( 2006-03-03) 用vb怎莫使用DataGrid动态绑定DropDownList 和特textbox 啊? CSDN 网友 ( 2006-02-08) 写的不怎么好 CSDN 网友 ( 2005-12-06) 不错 whfking1 ( 2005-05-26) 老是出现这个问题:System.ArgumentException: Label1 既不是表 Table 的 DataColumn 也不是 DataRelation。 CSDN 网友 ( 2004-11-02) 文章很好,但是没有贴出前台html代码,这样别人看来会很麻烦。
【评论】 【关闭】 【报告bug】

#CFContent a:link {color: #000;text-decoration: none;}#CFContent a:visited {color: #000;text-decoration: none;}#CFContent a:hover {color: #F00;text-decoration: underline;}#CFContent a:active {color: #000;text-decoration: none;}#CFBig {width: 760px;clear: both;margin: auto;font-family: Tahoma, sans-serif;text-align: center;background-color: #FFF;}#CFBig #CFContent {margin: auto;width: 500px;text-align: center;}#CFBig #CFContent p {margin: 2px;font-size:9pt; }#CFBig hr {height: 1px;color: #4682B4;}#CFBig #CFBiaoShi {width: 40px;float: right;}

网站简介-广告服务-网站地图-帮助信息-联系方式-English-问题报告

CSDN北京百联美达美数码科技有限公司  版权所有  京 ICP 证 020026 号 CSDN

© 2000-04, CSDN.NET, All Rights Reserved


 

用户登录 新用户注册  天极IT搜索    天极网站群:天极Yesky | 天极ChinaByte | IT专家网
繁体版 RSS订阅
天极Yesky
天极网分站
北京站 上海站 广东站
重庆站 成都站 沈阳站
查产品 看行情 经销商 导购
数码 评测 互动杂志 >>更多
天极群乐 数字高清 照片处理
阅读排行 专题总汇 GOGO资讯
  • 笔记本
    笔记本
  • 台式机
    台式机
  • 手机
    手机
  • MP3
    MP3
  • MP4
    MP4
  • 相机
    相机
  • 摄像机
    摄像机
  • DIY硬件
    DIY硬件
  • 外设
    外设
  • 网络
    网络
  • 服务器
    服务器
  • 数字家庭
    数字家庭
  •  IT技术 | 软件 Windows 设计 Photoshop 网页 开发 安全 办公 认证 论坛 数字生活 | E时代 游戏 动漫 图片 壁纸 社区 网摘 博客 下载
      您现在的位置是: 软件 > 开发者网络 > 程序方舟 > 服务器端脚本编程 > ASP专辑 > 正文        

    T O P 排 行 - ASP入门到精通
    - 矢量图象设计三剑客
    - Visual Basic精彩编程100例
    - 玩转Excel“单元格格式”

    网 校 热 门 第二届全国IT技能大赛 软考成就程序人生梦想 免费试学天极网校课程 认证资讯全新改版 3000元大奖助您程考冲刺   动态的管理ASP.NET DataGrid数据列   2003-04-28· · ··动网先锋

      在ASP.NET的DataGrid数据显示控件编程中,我们有几种方式可以增加DataGrid columns。其中最常见的方法是在web forms设计器中增加,通过在控件工具箱中拖访DataGrid控件到web设计页面,然后在属性生成器中增加Columns列;还有一种方式就是在HTML视图模式下更改HTML代码的方式增加Columns列。但是这两种方式都是在设计时进行的,一旦设计完成就无法更改。其实我们也可以在程序运行时动态的增加或者删除Columns列。在这篇文章中,我将向大家介绍如何编程实现在运行时动态的增加和删除Columns列,其实是通过隐藏或者现实Columns列来实现的。

      DataGrid 的Columns属性是访问datagrid Columns的关键所在。访问这个属性返回的是DataGridColumnCollection这样的一个集合对象,它包含了所有的DataGrigColumn对象。DataGridColumnCollection提供了增加一个DataGrigColumn对象和删除一个已经存在的DataGrigColumn对象的方法。,我们将使用DataGridColumnCollection的Add方法来增加一个DataGrigColumn对象,从而在运行时动态的增加一列到DataGrid中去。一个DataGrigColumn代表DataGrid的一列,DataGrid的Visible属性用来显示或者隐藏一个列。

      好了,下面让大家跟我一起来创建一个DynamicDataGrid的C#的ASP.NET的工程,他有隐藏和显示DataGrid 的每一列的选项。

      在我用VS.NET创建的web application里面,我在设计页面上拖放了一个Panel 控件。在这个panel控件上,我放置了一个DataGrid控件,一个DropDownList控件,两个Button控件用于改变DataGrid控件的属性。最后的设计界面看起来是下图这样的。

     

     

      现在我们开始创建两个方法:FillDataGrid()和FillColumnsList()方法。FillDataGrid()用于增加一个列到DataGrid控件和用DataSet数据源来填充它。在这里的我是通过DB.GetDataSet()方法来获取DataSet的。大家可以参照附加的源代码文件(DB.CS)获取更多的细节。

      下面的代码说明了CreateDataGrid()的实现。从代码中可以看出,我创建了三个列,用BoundColumn的DataField属性绑定到Dataset的ID,Name和Address字段。BoundColumn类继承自DataGridColumn类。

    private void CreateDataGrid()
    {
    // Set DataGrid properties
    DataGrid1.AutoGenerateColumns = false;

    // Get a DataSet object filled with data
    DataSet ds = DB.GetDataSet();

    // Create ID column & add to DataGrid
    BoundColumn col = new BoundColumn();
    col.HeaderText="User ID";
    col.DataField="ID";
    DataGrid1.Columns.Add(col);

    // Create Name column & add to DataGrid
    col = new BoundColumn();
    col.HeaderText="User Name";
    col.DataField="Name";
    DataGrid1.Columns.Add(col);

    // Create Address column & add to DataGrid
    col = new BoundColumn();
    col.HeaderText="User Address";
    col.DataField="Address";
    DataGrid1.Columns.Add(col);

    // DataGrid data binding
    DataGrid1.DataSource = ds.Tables[0];
    DataGrid1.DataBind();
    }

      FillColumnsList()方法只是简单的从DataGrid中读取列名,并且将这些列(Columns)名填充到DropDownList控件的下拉列表中去。我们将使用DropDownList控件来选取隐藏或者显示的列。

    private void FillColumnsList(DataGrid grid)
    {
    foreach (DataGridColumn col in grid.Columns)
    {
    ColumnsList.Items.Add(col.HeaderText);
    }
    }

      接着我们来添加HideDataGridColumn()方法来具体的通过index索引和bool值两个参数来显示或者隐藏一个列。在这里,我仅仅是简单的设置Columns列的Visible属性为true或者false.

    private void HideDataGridColumn(int index, bool show)
    {
    DataGrid1.Columns[index].Visible = show;
    }

      最后的工作就是增加Show Column和Hide Column的单击事件处理。正如我们在代码中看到的一样,我只是简单的调用HideDataGridColumn()方法来显示或者隐藏列,当然要传入参数了。

    private void HideColumnBtn_Click(object sender, System.EventArgs e)
    {
    HideDataGridColumn(ColumnsList.SelectedIndex, false);
    this.DataBind();
    }
    private void ShowColumnBtn_Click(object sender, System.EventArgs e)
    {
    HideDataGridColumn(ColumnsList.SelectedIndex, true);
    this.DataBind();
    }

      OK,所有的工作都结束了,我们看看运行的结果如何。你可以通过下拉列表来选择要隐藏或者显示的列,并且只需单击Show或者Hide按钮即可。


    【责任编辑:】
    【发表评论】【关闭窗口】
          ■ 相关内容    用ASP.NET和XML做的新闻系统
     在ASP.NET页面中实现数据饼图
     ASP.NET中在线用户统计
     ASP.NET里的事务处理
     在ASP.NET页面中实现数据棒图
     在ASP与ASP.NET之间共享对话状态
     ASP.NET如何存取SQL Server数据库图片
     ASP.NET服务器端异步Web方法
     使用ASP.NET开发移动通讯的几种方法
      感谢访问天极网,如果您觉得该文章涉及版权问题,请看这里!

     
    body{font-size:12px;}form{border:0px;padding:0px;margin:0px;}.floorbody{width:100%;height:108px;border-top:#FF6600 2px solid;background-color:#F8F8F8;padding:1px 0px 1px 0px;}.floorleft{width:16%;height:108px;float:left;background-color:#EFEFEF;text-align:right;}.floorright{width:83%;height:108px;float:right;text-align:left;}.floorselect{height:40px;font-size:14px;font-weight:bold;color:#FF6600;padding-top:6px;}.floorleft1{float:left;width:210px;padding-top:7px;font-size:14px;}.floorright1{float:left;}.floordan{margin-top:1px;height:27px;width:85px;color:#545454;font-size:14px;font-weight:bold;padding-top:2px;border-bottom:#969696 1px solid;border-right:#969696 1px solid;}.floortext{width:300px;height:21px;}.floorlinks{width:100%;height:20px;}.floorlinks a:link,.floorlinks a:visited{text-decoration:none;color:#222222;}.floorlinks a:active,.floorlinks a:hover{text-decoration:underline;color:red;}.floordownlink{width:100%;height:26px;background-color:#FF6600;color:#ffffff;text-align:left;}.floordownlink a:link,.floordownlink a:visited{text-decoration:none;color:#ffffff;}.floordownlink a:active,.floordownlink a:hover{text-decoration:underline;color:#ffffff;}.floorleft2{float:left;padding-top:3px;padding-left:10px;text-align:left;}.floorright2{float:right;text-align:right;padding-top:3px;padding-right:10px;}.floorright2 a:link,.floorright2 a:visited{text-decoration:underline;color:#ffffff;}.floorright2 a:active,.floorright2 a:hover{text-decoration:underline;color:#ffffff;}.floorbottom{text-align:center;width:776px;height:70px;}.floorbottomleft{float:left;text-align:right;width:22%;padding-right:10px;}.floorbottomright{float:left;text-align:left;padding-top:5px;line-height:20px;}.floorbottom a:link,.floorbottom a:visited{text-decoration:none;color:#222222;}.floorbottom a:active,.floorbottom a:hover{text-decoration:underline;color:red;}.floor776{width:776px;text-align:center}.floor1003{width:1003px;text-align:center}
    更多精彩资讯尽在天极IT搜索
     
    Copyright (C) 1999-2006 Chinabyte.com, All Rights Reserved 版权所有 天极网络
    商务联系、网站内容、合作建议:010-82657868 详细联系方式 在线提交意见反馈
    渝ICP证B2-20030003号 Powered by 天极内容管理平台CMS4i

     

    为 ASP.NET Datagrid 创建自定义列

    Marcie Robillard
    DatagridGirl.com

    2003 年 9 月

    摘要:ASP.NET Datagrid 是 Web 开发人员可以使用的一个功能强大的控件。通过添加自定义列以便为用户更准确地显示数据,来学习如何增强该控件的功能。(本文包含一些指向英文站点的链接。)

    适用于:
        Microsoft® ASP.NET

    下载本文的源代码。(请注意,在示例文件中,程序员的注释使用的是英文,本文中将其译为中文是为了便于读者理解。)

    目录

    简介
    重复使用的情况
    DropDownList 方案
    内置的 Datagrid 列
    传统方法:TemplateColumn 中的 DropDownList
    所有列的基础:DataGridColumn
    可以重复使用的方法:创建 DropDownColumn
    使用 DropDownColumn

    小结

    简介

    不得不承认,为 Microsoft® ASP.NET 编写 Datagrid 代码包括大量的重复工作。尽管我深受该控件的困扰,但我还是不断寻找简化这类任务的捷径。谁都不愿意做重复的工作,对不对?为了摆脱这种烦人的工作,我们要将多个项目中的重复代码封装到一个可重复使用的程序包中。这才是面向对象的编程工作所要解决的问题,使用 Datagrid 也不例外。对于 Datagrid 控件来说,要实现该目的,需要将常用的代码放到一个内置的列类型中(将在第一个示例中使用),然后创建一个可以在多个 Datagrid 对象中重复使用的自定义列类型。

    本文介绍使用标准 TemplateColumn 在一个 Datagrid 列中使用 DropDownList 控件的过程,然后将该逻辑转换为您的自定义 Datagrid 列类型,我称其为 DropDownColumn。已经为您创建了一些免费的 Datagrid 列,您可以到 MetaBuilders.com 下载所需的类型。

    重复使用的情况

    如果您的小组与许多组织一样,已经将业务逻辑和/或数据访问逻辑分成单独的组件或组件集,而剩下的 ASP.NET 文件、ASPX 及其代码只包含纯粹的表示逻辑。(“纯粹”是一个相对的词语。)但是,即使是表示层的逻辑有时也会重复使用,这样,下次某个用户来到您门前说,“我想让我的应用程序在‘财务’方面看起来与苏茜的一样”时,您可以重复使用“财务”应用程序的部分表示内容快速为其构建一个这样的应用程序。您可能还想将一些逻辑打包,在 Web 上销售或在您的 Web 站点分发。ASP.NET 使这一切比以往更容易实现,因为它使您可以创建自己的服务器控件,或从现有的类型导出列类型,从而获得所需的功能。

    DropDownList 方案

    假设您正在本地 Microsoft SQL Server™ 中编辑 Northwind 数据库(或做其他工作),您想使您的用户(我们称之为 Ed,仓库保管员)可以编辑 Orders 表。其中一个字段包含运输信息 (ShipVia),Ed 要能够修改该字段的信息。在显示模式下,运输公司应显示为纯文本。当 Ed 单击 Edit(编辑)按钮时,您不光要为他提供一个 TextBox 以编辑运输方式代码(1、2 或 3),还要为他提供一个包含可以选择不同运输公司的 DropDownList。(因为 Ed 记不住哪个运输公司对应哪个号码,所以,DropDownList 方案可以帮助他解决这个问题。)

    图 1:选择运输公司

    内置的 Datagrid 列

    了解问题的大概情况后,现在我们后退一步,看一下 ASP.NET 中构建的 5 种 Datagrid 列类型及其父类型 DataGridColumn

    • BoundColumn。这是文本字段的标准显示。它显示为纯文本,但是当 Datagrid 处于“编辑”模式时,它将转换为 TextBox。还可以选择格式化选项。
    • HyperlinkColumn。用于显示文本数据,还代表一个 Web 地址 (URL)。URL 可以与显示文本相同,也可以不同,它们都可以单独设置。它显示为 <a href=...> 标记。
    • ButtonColumn。它使用户能够按行与网格进行交互。它可以显示为超链接 LinkButton (<a href=...>) 或 Pushbutton (<input type="button">)。单击该按钮时将触发 PostBack,而在 Datagrid 上触发 ItemCommand 事件。
    • EditCommandColumn。它与 ButtonColumn 类似,但是它自动创建用于编辑 Datagrid、取消或提交更改的按钮。触发 ItemCommand 事件,以及所单击按钮的特定事件:EditCommandCancelCommandUpdateCommand
    • TemplateColumn。用于完全控制显示给用户的控件,分为多种模板,例如 ItemTemplateEditItemTemplate。任何 ASP.NET 或 HTML 控件或控件组都可以放置在这些模板中。
    注意:直接使用这些列类型之前,请关闭 AutoGenerateColumns(运行时自动生成列)。然后,您可以在属性生成器中使用这些列类型,或者直接在 ASPX 文件的 HTML 代码中使用。

    图 2:从 DataGridColumn 中继承的 5 种内置列

    尽管这些列类型非常有用,它们不过是了解 Datagrid 列内容的开始。

    传统方法:TemplateColumn 中的 DropDownList

    在研究如何创建新列类型之前,首先让我们看一下如何通过直接在 TemplateColumn 内使用 DropDownList 解决下拉列表的问题,而不用自定义列。ItemTemplate 将只包含表示当前值的纯文本表示,而 EditItemTemplate 包含一个需要在运行时管理的 <asp:DropDownList> 控件。

    <asp:DataGrid id="DataGrid1"    runat="server" CssClass="grid"    AutoGenerateColumns="False">   <Columns>      <asp:EditCommandColumn          EditText="Edit" CancelText="Cancel"          UpdateText="Update" />      <asp:BoundColumn          DataField="OrderID" ReadOnly="True"          HeaderText="Order ID" />      <asp:BoundColumn          DataField="ShipName" HeaderText="Ship to"          ReadOnly="True" />      <asp:BoundColumn          DataField="ShipCountry" HeaderText="Country"          ReadOnly="True" />      <asp:TemplateColumn HeaderText="Ship Method">         <ItemTemplate>            <%#Container.DataItem("ShipVia")%>         </ItemTemplate>         <EditItemTemplate>            <asp:DropDownList runat="server" ID="Dropdownlist1"/>         </EditItemTemplate>      </asp:TemplateColumn>   </Columns></asp:DataGrid>

    绑定 Datagrid 的代码:

    Sub BindGrid()    Dim SQL As String = "SELECT OrderID,       ShipName, ShipCountry, ShipVia FROM Orders"    Dim DA As SqlDataAdapter = New SqlDataAdapter(SQL, ConnStr)    Dim DS As New DataSet    DA.Fill(DS, "Orders")    DataGrid1.DataSource = DS.Tables("Orders").DefaultView    DataGrid1.DataBind()End Sub

    当前编辑的项目是在触发 DatagridItemDataBound 事件时绑定到 DropDownList 的。使用 ItemDataBound 事件时,请检查当前项目的 ListItemType,否则您可能会发现您正在使用 HeaderItem 或其他不适用的项目类型。为 EditItem 引用 DropDownList 控件。在下面的代码中,我直接使用单元格控件集进行说明(为了与后面的示例保持一致),但是,您可以采用简单的方法,直接为 DropDownList 控件指定 ID,并使用 Datagrid 项目的 FindControl 方法定位控件引用。由于 Datagrid 被绑定到 DataTable 的默认视图,而该视图的元素属于 DataRowView 类型,所以您可以将当前项目的 DataItem 属性转换为一个 DataRowView 实例。这样,您可以按字段名直接引用 DataItem 中的字段。使用这种方法,将“ShipVia”的当前值保存到该记录中,并使用它选择相应的下拉列表项。

    Private Sub DataGrid1_ItemDataBound(ByVal sender As Object, _    ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) _       Handles DataGrid1.ItemDataBound    If e.Item.ItemType = ListItemType.EditItem Then        Dim DRV As DataRowView = CType(e.Item.DataItem, DataRowView)        Dim CurrentShip As String = DRV("ShipVia")        Dim DDL As DropDownList = _      CType(e.Item.Cells(4).Controls(1), DropDownList)        Dim SQL As String = _      "SELECT ShipperID, CompanyName FROM Shippers ORDER BY ShipperID"        Dim DA As SqlDataAdapter = New SqlDataAdapter(SQL, ConnStr)        Dim DS As New DataSet        Dim item As ListItem        DA.Fill(DS, "Shippers")        DDL.DataSource = DS.Tables("Shippers").DefaultView        DDL.DataTextField = "CompanyName"        DDL.DataValueField = "ShipperID"        DDL.DataBind()        item = DDL.Items.FindByValue(CurrentShip)        If Not item Is Nothing Then item.Selected = True    End IfEnd Sub

    最后,编写从 DropDownList 中检索当前选定值的代码,并执行数据库更新:

    Private Sub DataGrid1_UpdateCommand(ByVal source As Object, _   ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) _   Handles DataGrid1.UpdateCommand    Dim DDL As DropDownList = _      CType(e.Item.Cells(4).Controls(1), DropDownList)    Dim NewShip As Integer = DDL.SelectedValue    Dim OrderID As Integer = Int32.Parse(e.Item.Cells(1).Text)    Dim SQL As String = _      "UPDATE Orders SET ShipVia=@Ship WHERE OrderID=@ID"    Dim Conn As SqlConnection = New SqlConnection(ConnStr)    Dim Cmd As New SqlCommand(SQL, Conn)    Cmd.Parameters.Add(New SqlParameter("@Ship", NewShip))    Cmd.Parameters.Add(New SqlParameter("@ID", OrderID))    Conn.Open()    Cmd.ExecuteNonQuery()    Conn.Close()    DataGrid1.EditItemIndex = -1    BindGrid()End Sub

    所有列的基础:DataGridColumn

    我们回顾一下所有内置列类型的父类型 DataGridColumn。(参见图 1。)它包含所有 Datagrid 列中常用的属性和方法。带星号的类型表示您创建自定义列类型时要使用的类型。

    DataGridColumn 属性

    • FooterStyle (TableItemStyle)
    • FooterText(字符串)
    • HeaderImageUrl(字符串)
    • HeaderStyle (TableItemStyle)
    • HeaderText(字符串)
    • ItemStyle (TableItemStyle)
    • SortExpression(字符串)
    • Visible(布尔值)

    DataGridColumn 方法

    • Initialize
    • InitializeCell
    • LoadViewState
    • OnColumnChanged
    • SaveViewState
    • TrackViewState

    可重复使用的方法:创建 DropDownColumn

    首先要在 Microsoft® Visual Studio® .NET 中创建一个新类库,并将其命名为 MyCustomColumn。添加一个新类 DropDownColumn,并确保在您的类定义中添加命名空间,这样您的初始代码应如下所示:

    Namespace MyCustomColumn    Public Class DropDownColumn        Inherits DataGridColumn        Public DataSource As ICollection        Public DataField As String        Public DataTextField As String        Public DataValueField As String    End ClassEnd Namespace

    我还声明了 4 个公共属性,如下所示:

    • DataSource。它是用来填充 DropDownList 的数据集。可以是实现 ICollection 接口的任何内容。在本文的示例中,我使用 ArrayListDataView
    • DataField。它是父 Datagrid 数据源中的字段,它与从下拉列表中选定的数据相对应。例如,如果 DataSource 包含一个状态集,DataField 将类似于“StateCode”,也可以在表格中使用状态随意命名字段。
    • DataTextField。这是要显示在下拉列表中的文本,可以是下面的值,也可以不是。
    • DataValueField。这是表示特殊下拉选项的值。DataValueField 通常是一个整数值或其他代码,而 DataTextField 是对用户来说更有意义的文本说明。

    接下来,覆盖 InitializeCell,它是 Datagrid 列的一个固有事件。列中的所有单元格都将发生 InitializeCell,它与直接使用 Datagrid 时的 ItemCreated 事件非常相似。您可以使用它来管理单元格内容,例如设置 HeaderText,添加您将向其中添加数据的 DropDownList 控件。我已经为单元格的 DataBinding 事件添加了处理程序,需要根据当前是否正在编辑行来采取不同的处理方式。每个 System.Web.UI.Control 都有一个 DataBinding 事件,当数据被绑定到控件时,您可以从这里访问底层的数据,本例中为 Datagrid 中的 TableCell 对象。

    Public Overrides Sub InitializeCell(ByVal cell As TableCell, _   ByVal columnIndex As Integer, _   ByVal itemType As ListItemType)       MyBase.InitializeCell(cell, columnIndex, itemType)       Select Case itemType              Case ListItemType.Header                   cell.Text = HeaderText              Case ListItemType.Item, ListItemType.AlternatingItem                   AddHandler cell.DataBinding, AddressOf ItemDataBinding              Case ListItemType.EditItem                   AddHandler cell.DataBinding, AddressOf EditItemDataBinding                   Dim DDL As New DropDownList                   cell.Controls.Add(DDL)            End Select        End Sub

    接下来是 ItemDataBinding 例程,当对 Datagrid 中的 Item 或 AlternatingItem 进行数据时,将触发该例程。您需要引用回正在绑定的 TableCell,可以直接转换传递给事件的“发送者”对象,再使用 TableCellNamingContainer 属性引用当前的 DataGridItem。这里只能以纯文本格式显示 DataField 的内容,就象显示在 BoundColumn 中一样。最后,如果用户指定的字段不存在,我将为用户显示更友好的错误信息,而不是仅仅显示“索引超出范围”这样的一般信息。

    Private Sub ItemDataBinding(ByVal sender As Object, ByVal e As EventArgs)     Dim cell As TableCell = CType(sender, TableCell)     Dim DGI As DataGridItem = CType(cell.NamingContainer, DataGridItem)     Try          cell.Text = DGI.DataItem(DataField)     Catch RangeEx As IndexOutOfRangeException          Throw New Exception("Specified DataField was not found.")     Catch OtherEx As Exception          Throw New Exception(OtherEx.InnerException.ToString)     End Try End Sub 

    下一步,编写 EditItemDataBinding 事件的代码,当某个行进入“编辑”模式时,将在我们的自定义列单元格上触发该事件。再次引用当前单元格并在调用 InitializeCell 方法时插入 DropDownList 控件。在 DropDownList 中添加一个空项目作为第一个选项,如果列中的当前数据与您从 DataSource 集合中选择并放在列表中的任何项目都不匹配,则选择该选项。

    然后,需要确定所传入集合的类型。在本例中,我将处理两种情况:通过 ArrayList 传递一组字符串,或者数据表中的 DataView,它由 DataRowView 项目构成。对于字符串数据,我将输入一个新的 ListItem,并设置下拉项的值和文本。由于这两种情况是相同的,所以这里只需要文本。但是我将选择相应的项目来根据值作出选择,以便与下一个示例保持一致,下一个示例将设置一个单独的值属性。对于 DataRowView 项目,上一个示例中已指出,DataRowViewInstance("FieldName") 返回一个表示该字段中的数据的对象。可以使用同样的方法检索 DataTextFieldDataValueFields 需要的值。

    最后,抛出一些异常以处理开发人员使用列时遇到的常见错误,例如向 DataField 属性发送无效字段名,或传入不兼容的 DataSource 类型。我已经对要弹出的异常消息进行了硬编码,但希望您在实际的应用程序中将这些消息保存到更容易配置的位置。例如,如果您希望在全球范围内使用您的应用程序,则可以保存到您的 web.config 文件或资源文件中。同样,您不一定非要再次抛出“未找到指定的 DataField”异常,因为在 Datagrid 被置于“编辑”模式之前可能已经在 ItemDataBinding 事件中捕获了该异常。

    Private Sub EditItemDataBinding(ByVal sender As Object, _ByVal e As EventArgs)            Dim cell As TableCell = CType(sender, TableCell)            Dim DDL As DropDownList = _CType(cell.Controls(0), DropDownList)            Dim DataSourceItem As Object            Dim item As ListItem            Dim DGI As DataGridItem            '首先添加一个空选项            DDL.Items.Add(New ListItem(""))            For Each DataSourceItem In DataSource                Select Case DataSourceItem.GetType.ToString                    Case "System.String" '应用到 ArrayList 示例                        item = New ListItem(DataSourceItem, DataSourceItem)                        DDL.Items.Add(item)                    Case "System.Data.DataRowView"                        Dim DRV As DataRowView = _                           CType(DataSourceItem, DataRowView)                        item = New_              ListItem(DRV(DataTextField), DRV(DataValueField))                        DDL.Items.Add(item)                    Case Else                        Throw New Exception("Invalid DataSource type.")                End Select            Next            Try                DGI = CType(cell.NamingContainer, DataGridItem)                item = DDL.Items.FindByValue(DGI.DataItem(DataField))            Catch RangeEx As IndexOutOfRangeException                Throw New Exception("Specified DataField was not found.")            Catch OtherEx As Exception                Throw New Exception(OtherEx.InnerException.ToString)            End Try            If Not item Is Nothing Then item.Selected = TrueEnd Sub

    使用 DropDownColumn

    以上是创建 DropDownColumn 类所需的所有代码,下面我们看一看如何在应用程序中使用该控件。如果您是在家中学习,而且还没有开始做,请将上面创建的命名空间编译到 MyCustomColumn.dll 中,并将其复制到您想试验的应用程序的 /bin 文件夹中。本例中,我创建一个新的 Web 应用程序 UseCustomColumn,并在我的 /bin 目录的 MyCustomColumn.dll 中添加一个引用。在 ASPX 文件的顶部,添加 @Register 指令:

    <%@ Register TagPrefix="dgg"       Namespace="MyCustomColumn"       Assembly="MyCustomColumn" %>

    请注意,新的 Datagrid 列类型不会为 Datagrid 出现在 Visual Studio .NET 属性生成器中,因此您需要进入 HTML 视图并在其中添加列声明。确保 Datagrid 声明位于一组 <form runat="server">...</form> 标记之中,这些标记用于处理 PostBack。ASPX 文件的其余部分应如下所示:

    <%@ Page Language="vb"    AutoEventWireup="false"    Codebehind="WebForm1.aspx.vb"    Inherits="UseCustomColumn.WebForm1" Trace="False" Debug="True"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML>   <HEAD>      <title>WebForm1</title>      <LINK rel="stylesheet" type="text/css" href="Styles.css">      <meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">      <meta name="CODE_LANGUAGE" content="Visual Basic 7.0">      <meta name="vs_defaultClientScript" content="JavaScript">      <meta name="vs_targetSchema"          content="http://schemas.microsoft.com/intellisense/ie5">   </HEAD>   <body>   <form id="Form1" method="post" runat="server">   <asp:DataGrid id="DataGrid1"       runat="server" CssClass="grid"       AutoGenerateColumns="False">      <Columns>         <asp:EditCommandColumn             EditText="Edit" CancelText="Cancel"             UpdateText="Update" />         <asp:BoundColumn             DataField="OrderID"             ReadOnly="True"             HeaderText="Order ID"/>         <asp:BoundColumn             DataField="ShipName"             HeaderText="Ship to"             ReadOnly="True"/>         <asp:BoundColumn             DataField="ShipCountry"             HeaderText="Country"             ReadOnly="True"/>          <dgg:DropDownColumn DataField="ShipVia" HeaderText="Ship Method" />      </Columns>   </asp:DataGrid>   </form>   </body></HTML>

    Datagrid 被绑定到 Northwind 示例的 Orders 表,自定义 DropDownColumn 被绑定到 ShipVia 列。现在我只设置 DataField 属性,因为刚刚绑定到一个简单的 ArrayList,不需要 DataTextFieldDataValueField 属性。如果您有预定义的常数列表或者您需要一个快速设置选项的方法,ArrayList 选项最简单。DropDownColumnDataSource 在代码中设置,首先引用 DropDownColumn

    Dim DDC As MyCustomColumn.DropDownColumnDDC = CType(DataGrid1.Columns(4), MyCustomColumn.DropDownColumn) Dim AL As New ArrayList AL.Add("Shipping Company A") AL.Add("Shipping Company B") AL.Add("Shipping Company C") DDC.DataSource = AL

    下面是运行此代码的结果:

    图 3:使用 ArrayList

    接下来,我需要转换该示例以便使用数据库中的活动表。ShipVia 是查找表 Shippers 的外键,我在代码中将其指定为 DropDownColumnDataSource。我还需要改变 DropDownColumn 声明,以包括与 Shippers 表中的相应字段匹配的 DataTextFieldDataValueField 名称:

    <dgg:DropDownColumn    DataField="ShipVia"    DataTextField="CompanyName"    DataValueField="ShipperID" HeaderText="Ship Method" />

    然后将两个 Orders 表绑定到 Datagrid,将 Shippers 表绑定到自定义列:

         Dim SQL As String =      "SELECT OrderID, ShipName, ShipCountry, ShipVia FROM Orders"        Dim DA As SqlDataAdapter = New SqlDataAdapter(SQL, ConnStr)        Dim DS As New DataSet        DA.Fill(DS, "Orders")        'Dim Cmd As SqlCommand = New SqlCommand(SQL, Conn)        'Conn.Open()        'DataGrid1.DataSource = _      Cmd.ExecuteReader(CommandBehavior.CloseConnection)        DataGrid1.DataSource = DS.Tables("Orders").DefaultView        SQL = "SELECT ShipperID, CompanyName " & _            "FROM Shippers ORDER BY ShipperID"        DA.SelectCommand.CommandText = SQL        DA.Fill(DS, "Shippers")        DDC.DataSource = DS.Tables("Shippers").DefaultView        DataGrid1.DataBind()

    DataGridColumn 使用活动数据,根据 Orders 表中的值(1、2 或 3)自动选择正确的项目,如下所示:

    图 4:从数据库中检索数据

    使用 DropDownColumn 的最后一步是检索选定的值以传递回数据库更新。为此,只需在单元格内引用 DropDownList 控件,并确定其 SelectedValue 属性:

     Private Sub DataGrid1_UpdateCommand( _   ByVal source As Object, _   ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs) _   Handles DataGrid1.UpdateCommand        Dim CustomDDL As DropDownList = _CType(e.Item.Cells(4).Controls(0), DropDownList)        Dim NewShip As Integer = CustomDDL.SelectedValue        Dim OrderID As Integer = Int32.Parse(e.Item.Cells(1).Text)        Dim SQL As String = _         "UPDATE Orders SET ShipVia=@Ship WHERE OrderID=@ID"        Dim Conn As SqlConnection = New SqlConnection(ConnStr)        Dim Cmd As New SqlCommand(SQL, Conn)        Cmd.Parameters.Add(New SqlParameter("@Ship", NewShip))        Cmd.Parameters.Add(New SqlParameter("@ID", OrderID))        Conn.Open()        Cmd.ExecuteNonQuery()        Conn.Close()        DataGrid1.EditItemIndex = -1        BindGrid()    End Sub

    小结

    上文概述了如何以 DataGridColumn 为父类型创建一个新类型、如何进行数据绑定以及如何将其应用到实际应用程序中。这只是可重复使用的 Datagrid 列的一个示例,因此,您需要检查您自己的应用程序,以确定哪些重复的功能可以封装到其自己的自定义 Datagrid 列中。您可以开发自己的列,以解决常见问题(例如,在列中显示 DropDownList),或满足您公司的特殊需要。您也不必拘泥于本文的示例,只在自定义列中包含一个 ASP.NET 控件,您可以编写更复杂的结构,例如将一系列控件、第三方内容或整个 Datagrid 控件嵌套到列中,以表现多层信息。总之,您可以充分发挥您的想象力。

    5 个内置的列类型非常有用,它们可以满足使用 Datagrid 控件进行显示的大多数情况下的需要。现在并没有开发您自己的控件,只是将一些有意义的内容随便放到 TemplateColumn 中。创建自定义列使您可以突破这些限制,在您的 Datagrid 应用程序中添加丰富的功能。

    作者简介

    “Datagrid 女孩”Marcie Robillard 是 Microsoft 最优秀的 ASP.NET 专家,她是一位独立的 ASP.NET 顾问和培训师。ASP.NET Datagrid 是她的专业,她还专门为此创建了一个 Web 站点 DatagridGirl.com。您可以从该站点找到优秀 Datagrid 文章的链接、Datagrid 内容的书评以及不断增加的 Datagrid 常见问题。Marcie 还花费了大量时间主持 ASP.NET 论坛,回答有关 Datagrid 的各种问题。Marcie 当前的任务是指导各公司开发自己的 .NET 技术。如果您的组织需要这方面的专业咨询或培训,请联系 Marcie@DatagridGirl.com。

    参考站点:

    MetaBuilders.com。免费的自定义 Datagrid 列,包括源代码 (C#)。

    DatagridGirl.com。有关 Datagrid 的各种资源。

    Scott Mitchell 著的《ASP.NET Data Web Controls》,SAMS 2003 年出版。ISBN 0672325012


    原创粉丝点击