首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网络编程-> ASP.NET教程
如何在DataGrid控件中实现编辑、删除、分类以及分页操作-.NET教程,Asp.Net开发
作者:网友供稿 点击:116
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
如何在datagrid控件中实现编辑、删除、分类以及分页操作

文章出处:http://www.c-sharpcorner.com/asp/code/northwindlc.asp
前言:
这篇文章主要介绍如何在datagrid控件中实现编辑、删除、分类以及分页操作。为了实现我们的意图,我们使用sqlserver2000自带的northwind数据库。程序分为两部分:
1.包含html代码的.aspx文件
2.包含所有逻辑及方法的后台c#类文件
代码:
aspx文件:
在这里我们设计了一个datagrid对象,我为一些属性和方法作了注解。它就变得如此的简单:
    <asp:datagrid id="mydatagrid" style="z-index: 101; left: 16px; position: absolute; top: 104px" runat="server"
        borderstyle="ridge"
        gridlines="none"
        borderwidth="2px"
        bordercolor="white"
        backcolor="white"
        cellpadding="3"
        cellspacing="1"
        allowpaging="true"     // allowpaging属性的"true"时, 可进行分页操作
        allowsorting="true"      // 这是分类属性
        pagesize="15"       //设每页25条记录
        pagerstyle-mode="nextprev"      //有2种模式风格:next previous和page numberin
        pagerstyle-nextpagetext="next"
        pagerstyle-prevpagetext="previous"
        pagerstyle-horizontalalign="center"
        pagerstyle-position="topandbottom"
        datakeyfield="productid"       // datagrid的每条记录都包含一个productid字段
        onpageindexchanged="mydatagrid_pageindexchanged"    // 当用户进行翻页操作时就激活mydatagrid_pageindexchanged函数(function)
        onsortcommand="sort_grid"                           //当用户对datagrid分类时激活sort_grid(function)函数
        ondeletecommand="mydatagrid_delete"                 //这一事件激活mydatagrid_delete函数(function)删除一条记录
        onupdatecommand="mydatagrid_update"                 //这一事件激活mydatagrid_update函数(function)更新一条记录
        oncancelcommand="mydatagrid_cancel                  //这一事件激活mydatagrid_cancel函数(function)取消当前操作
        oneditcommand="mydatagrid_edit"                     //这一事件激活mydatagrid_edit函数(function)编辑一条记录
        autogeneratecolumns="false"                         // 设置自动产生行为"false"
        horizontalalign="left">
        <footerstyle forecolor= "black"backcolor="#c6c3c6"></footerstyle>
        <headerstyle font-bold= "true" forecolor= "#e7e7ff"backcolor="#4a3c8c"></headerstyle>
        <pagerstyle nextpagetext="next" prevpagetext="previous" horizontalalign="right" forecolor="black"  
                            position= "topandbottom"backcolor="#c6c3c6"></pagerstyle>
        <selecteditemstyle font-bold= "true" forecolor= "white"backcolor="#9471de"></selecteditemstyle>
        <itemstyle forecolor= "black"backcolor="#dedfde"></itemstyle>

   <columns>
     <asp:editcommandcolumn buttontype="linkbutton" updatetext= "<img border=0 src=ok.gif>" canceltext= "<imgborder=0 src=cancel.gif>" edittext= "<imgborder=0src=edit.gif>"></asp:editcommandcolumn>
     <asp:buttoncolumn text= "<img border= 0src= delete.gif>"commandname="delete"></asp:buttoncolumn>
     <asp:boundcolumn datafield= "productid" sortexpression="productid" readonly="true" headertext= "productid"></asp:boundcolumn>
     <asp:boundcolumn datafield= "productname" sortexpression="productname" headertext= "productname"></asp:boundcolumn>
     <asp:boundcolumn datafield="quantityperunit" sortexpression="quantityperunit" headertext= "quantity perunit"></asp:boundcolumn>
     <asp:boundcolumn datafield="unitprice" sortexpression="unitprice" headertext= "unit price"dataformatstring="{0:c}"></asp:boundcolumn>
     <asp:boundcolumn datafield="unitsinstock" sortexpression="unitsinstock" headertext= "units instock"></asp:boundcolumn>
     <asp:boundcolumn datafield="unitsonorder" sortexpression="unitsonorder" headertext= "units onorder"></asp:boundcolumn>
     <asp:boundcolumn datafield= "reorderlevel" sortexpression="reorderlevel" headertext= "reorderlevel"></asp:boundcolumn>
     <asp:templatecolumn headertext="discontinued" sortexpression="discontinued">
      <itemtemplate>
       <asp:checkbox id= "discontinued" runat="server" checked= <%# databinder.eval(container.dataitem, "discontinued")%> />
      </itemtemplate>
     </asp:templatecolumn>
    </columns>
</asp:datagrid>
你看,是不是不难?关键在于我们常动手动脑。多看资料也很关键哦!
c#后台程序:
让我们先看一段程序:
   private void page_load(object sender, system.eventargs e)
   {
       if(!ispostback)
       {
            bindgrid();
       }
   }
上面展现的是一种非常好的技术,当页面不是postback状态时,就绑定数据。这意味着,一旦页面被请求数据将被绑定。
继续看程序:
/// <summary>
      /// 这个函数返回关于产品细节的dataset
  /// </summary>
  ///<returns></returns>
  private dataset getproductdata()
  {
   ///sqlstatement是一个sql语句(string型的)
   string sqlstatement="select  products.productid, products.productname, products.quantityperunit, products.unitprice, "+
                      "products.unitsinstock, products.unitsonorder, products.reorderlevel, products.discontinued "+
       "from  products"; :
   ///声明 sqlconnection对象:myconnection
  sqlconnection myconnection=new sqlconnection(@"server=(local)\netsdk;”+
”database=northwind;uid=northwind;pwd=northwind;");
///声明command对象:mycommand
   sqldataadapter mycommand = new sqldataadapter(sqlstatement,myconnection);
///设置command命令的类型为text类型
   mycommand.selectcommand.commandtype=commandtype.text;
   ///创建dataset对象实例
   mydataset = new dataset();
   ///把从表products返回的数据填充mydata
   mycommand.fill(mydataset, "products");
   ///最后返回mydataset对象
   return mydataset;
  }
这段代码执行给定的sql语句访问数据库,私有函数getproductdata返回一个包含数据记录的dataset。下一步,让我们看如何编辑记录:
/// <summary>
     /// 这个函数只有当用户点击edit按钮时才会被激活
  /// </summary>
  /// <paramname="sender"></param>
  /// <paramname="e"></param>
  protected void mydatagrid_edit(object sender, datagridcommandeventargs e)
  {
     ///找出被选定项目的索引(itemindex),并且进一步绑定数据
     mydatagrid.edititemindex = (int)e.item.itemindex;
     bindgrid();
  }
通过上面代码所附带的注解大家也能明白mydatagrid_edit函数的功能:当用户点击edit按钮时激活mydatagrid_edit函数,并且程序找到所要编辑的记录的索引,把该索引号分配给datagrid的edititemindex属性。
如果用户点击cancel按钮,将调用我们在上面的.aspx文件中提到的mydatagrid_cancel函数,程序如果分配给datagrid属性 edititemindex的值为-1,就意味着用户没有选择edit,程序如下:
/// <summary>
     /// 用户点击cancel按钮时激活mydatagrid函数
  /// </summary>
  /// <paramname="sender"></param>
  /// <paramname="e"></param>
  protected void mydatagrid_cancel(object sender, datagridcommandeventargs e)
  {
      mydatagrid.edititemindex = -1;
      bindgrid();
  }
下面的代码像我们展现了如何从datagrid中删除一条选中的记录。我们知道web控件datagrid有一datakeyfield属性,事实上它就包含了每条记录的productid字段值。您一定会问如何通过datakeyfield属性得到datagrid中选中记录的productid值呢?下面这段代码会让您释然的:
-----
int productid =(int)mydatagrid.datakeys[(int)e.item.itemindex];
-----
mydatagrid_delete函数代码如下:
        /// <summary>
        ///从dataset中删除一条记录
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void mydatagrid_delete(object sender, datagridcommandeventargs e)
{
            int productid =(int)mydatagrid.datakeys[(int)e.item.itemindex];
            string sqlstatement="delete products where productid="+productid;
            string myconnectionstring = "server=localhost;uid=sa;pwd=;database=northwind";

            sqlconnection myconnection = new sqlconnection(myconnectionstring);
            sqlcommand mycommand = new sqlcommand (sqlstatement,myconnection);            
            
            mycommand.commandtimeout = 15;
            mycommand.commandtype=commandtype.text;

            try
            {
                myconnection.open();
                mycommand.executenonquery();
                myconnection.close();
            }
            catch(exception ee)
            {
                throw ee;
            }
            mydatagrid.edititemindex = -1;
            bindgrid();                
    }
下面的代码用来更新northwind数据库的产品信息,
我们可以使用下面这项技术检索值:
-------------------
bool discon=((checkbox)e.item.findcontrol("discontinued")).checked;
-------------------
这时我们使用fincontrol()方法就能得到discontinued checkbox的值.
        /// <summary>
        ///更新记录
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void mydatagrid_update(object sender, datagridcommandeventargs e)
        {
            int productid =(int)mydatagrid.datakeys[(int)e.item.itemindex];
            string productname = ((textbox)e.item.cells[3].controls[0]).text;
            string quantityperunit=((textbox)e.item.cells[4].controls[0]).text;
            string unitprice = ((textbox)e.item.cells[5].controls[0]).text;
            int16 unitsinstock=int16.parse(((textbox)e.item.cells[6].controls[0]).text);
            int16 unitsonorder=int16.parse(((textbox)e.item.cells[7].controls[0]).text);
            int16 reorderlevel=int16.parse(((textbox)e.item.cells[8].controls[0]).text);
            bool discon=((checkbox)e.item.findcontrol("discontinued")).checked;
            int result;

            if(!discon)
            {
                result=0;
            }
            else
            {
                result=1;
            }
            string sqlstatement="update    products "+
                "set  productname="+productname+", "+
                "quantityperunit="+quantityperunit+", "+
                "unitprice ="+unitprice.substring(unitprice.indexof("¥")+1)+", "+
                "unitsinstock ="+unitsinstock+", "+
                "unitsonorder ="+unitsonorder+", "+
                "reorderlevel ="+reorderlevel+", "+
                "discontinued ="+result+
                " where     productid ="+productid;

                string myconnectionstring = "server=localhost;uid=xjb;pwd=xjb;database=northwind";
            sqlconnection myconnection = new sqlconnection(myconnectionstring);
            sqlcommand mycommand = new sqlcommand(sqlstatement,myconnection);            
            
            mycommand.commandtimeout = 15;
            mycommand.commandtype = commandtype.text;        

            try
            {
                myconnection.open();
                mycommand.executenonquery();
                myconnection.close();
            }
            catch(exception ee)
            {
                throw ee ;
            }

            mydatagrid.edititemindex = -1;
            bindgrid();
        }

接下来的bindgrid()调用私有函数getproductdata取得dataset对象并绑定到datagrid控件。
/// <summary>
/// 接受数据库数据并再次绑定
/// </summary>
  protected void bindgrid()
  {
   mydatagrid.datasource=getproductdata().tables["products"].defaultview;
   mydatagrid.databind();
  }
用户在datagrid中向前或向后移动时激活mydatagrid_pageindexchanged事件,因为datagrid 不能自动的获取新页的索引号,所以我们只能手动取得索引号。
        /// <summary>
        /// 分页操作
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void mydatagrid_pageindexchanged(object source, datagridpagechangedeventargs e)
        {
            mydatagrid.currentpageindex=e.newpageindex;
            bindgrid();
        }
     用户在任何时候想对数据分类时,就激活下面的sort_grid事件。例如,如果用户点击field headers,事件就将被激活,并且把数据分成我们想要的分类。 我们需要dataview对象去为e.sortexpression.tostring()方法分类,返回的是被点击域标题的分类。
/// <summary>
/// 分类
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void sort_grid(object sender, datagridsortcommandeventargs e)
{
    
    dataview dv= new dataview(getproductdata().tables["products"]);
    dv.sort= e.sortexpression.tostring();
    mydatagrid.datasource=dv;
    mydatagrid.databind();            
}
执行结果:
该程序在win2000+sqlserver2000+vs.netbeta2环境下测试成功,程序执行结果如下:



文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·ASP.NET三层架构示例(中文版)-.NET教程,面向对象编程
·C#自定义控件制作篇-.NET教程,C#语言
·asp.net上传图片时,产生预览
·关于DataGrid 数据导入Excel乱码-ASP教程,数据库相关
·ado.net中数据库连接方式
·用asp.net(c#)连接oracle数据库的方法
·网页制作小技巧-ASP教程,ASP应用
·动态改变asp.net网页的标题
·asp.net中利用cookies保持客户端信息
·关于C#中switch语句的一点注意-.NET教程,C#语言
最新文章
·用vb.net 2005编写定时关机程序_vb/vb.net教程
·vb.net实现窗体图标最小化到状态栏_vb/vb.net教程
·如何提高google adsense单价:渠道篇_网赚技巧
·做百度主题推广的经验谈_网赚技巧
·解读电子商务规划关键词_站长心得
·手把手教你建立自己的网站_站长心得
·学网页设计与网页制作,你该做些什么?_站长心得
·写给新人的google排名知识_google推广
·google网络推广adwords帐户申请解析_google推广
·如何合理提高google adsense的收入_google推广
相关主题
  • 如何在DataGrid绑定之前为DataSet添加新列-.NET教程,数据库应用
  • 如何在DataGrid里面产生滚动条-.NET教程,数据库应用
  • 如何在DataGrid里面使用动态图形表示数字-.NET教程,数据库应用
  • 如何在DataGrid里面产生滚动条而不滚动题头-.NET教程,Asp.Net开发
  • 如何在DataGrid控件中隐藏列-.NET教程,Asp.Net开发
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭