DataGrid入门经典

转载 2006年05月25日 16:20:00
前言: 
这篇文章主要介绍如何在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();             

入门有余, 经典不足 — 小评《C#入门经典》

鉴于C#程序设计语言这本Anders写的书就像是语言规格说明, 我推荐大家阅读C#入门经典(Beginning Visual C# 2010)入门. 说实话, 看到这本书的时候, 我稍微叹了口...
  • vagrxie
  • vagrxie
  • 2013年01月11日 07:21
  • 17315

《C#入门经典(第7版)》编写C#程序

两种基本的应用程序类型:控制台应用程序和桌面应用程序 1、开发环境:     Visual Studio      C#6      .NET Framework 4.6     register ...
  • u010590746
  • u010590746
  • 2017年05月21日 15:23
  • 2164

C#入门经典(第6版)

首先,必须说明,在学C#之前,已经学习C++有一年了,所以看C#时觉得入门很快,基础篇只看了与C++不同的地方。 刚学C#的时候,装的的是visual studio 2010,想着真么把C++的开发环...
  • fightingyxy
  • fightingyxy
  • 2016年04月21日 21:07
  • 502

《算法竞赛入门经典(第二版)》pdf

内容简介  · · · · · · 《算法竞赛入门经典(第2版)》是一本算法竞赛的入门与提高教材,把C/C++语言、算法和解题有机地结合在一起,淡化理论,注重学习方法和实践技巧。全书内容分为...
  • cf406061841
  • cf406061841
  • 2017年05月01日 13:28
  • 4988

《算法竞赛入门经典训练指南》pdf

下载地址:网盘下载 基本介绍 编辑 内容简介 《算法竞赛入门经典:训练指南》题目多选自近年来ACM/ICPC区域赛和总决赛真题,内容全面,信息量大,...
  • cf406061841
  • cf406061841
  • 2017年05月14日 00:18
  • 3216

算法竞赛入门经典(第2版)习题2-4详解

#include #define MAXN 100 double a[MAXN]={0};int main() { int n,m,count=0; while(1) { ...
  • big_DreamerLzq
  • big_DreamerLzq
  • 2016年06月22日 10:17
  • 1080

算法竞赛入门经典:第五章 基础题目选解 5.5 高精度乘法

/* 输入:10 输出:3628800 高精度乘法: 关键: 1 设定初始值_size = 0;//记住,初始化的时候,应该置_size = 0,否则不能做,初始化不需要逐个设置,直接用me...
  • qingyuanluofeng
  • qingyuanluofeng
  • 2015年08月11日 11:07
  • 691

读《Visual C++ 2013 入门经典》之感想

作为一个C++的初学者,我这几天一直在看Visual C++ 2013 入门经典,虽说只有两章,但是发现作者书写得很详细,也有很多的文字。对于我这样一个VC++的入门者,打算以后Windows开发工程...
  • appleapple20140513
  • appleapple20140513
  • 2015年02月09日 19:47
  • 817

SQL入门经典总结

初识SQL这三个字母,我以为是数据库,但是找度娘查了下,终于真想大白了,我也豁然开朗了。    SQL是Structured Query Language的缩写,即    结构化查询语言 来自 htt...
  • renmengmeng520
  • renmengmeng520
  • 2016年05月09日 19:52
  • 822

C#入门经典第6版学习 六

第五章  变量的更多内容 本章内容: 如何在类型之间进行隐式和显式转换 如何创建和使用枚举类型 如何创建和使用结构类型 如何创建和使用数组 如何处理字符串值 枚举:变量类型,用户定义了...
  • thebestleo
  • thebestleo
  • 2016年09月13日 16:56
  • 872
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DataGrid入门经典
举报原因:
原因补充:

(最多只允许输入30个字)