zoukankan      html  css  js  c++  java
  • Datagrid列表控件使用 dodo

     

     三种列表控件比较:
    Datagrid
    优点:1.灵活性强,内置事件丰富
                2.提供分页、编辑、排序等特性
                3.功能强大的Datagrid编辑器以及模板列
                4.快速开发、容易部署
                5.对于表格的操作非常方便
                6.内置多种布局风格
    缺点:1.性能不高,因为每次操作必须postback回服务器
                2.个性化输出数据有限(只能输出HTML表格)
    使用范围:主要用在含有数据的表格中,一般数据源是一个Dataset。对于有排序、分页、多列显示、对性能要求不是很高选用Datagrid.

    Datalist
    优点:1.拥有强大的模板特性,灵活性高
                2.支持数据的编辑状态
                3.性能优于Datagrid
    缺点:1.开发周期略比Datagrid高
                2.没有Datagrid编辑器
                3.不容易实现分页和排序功能
    使用范围:主要用于单列的数据列表、高性能的自定义数据表,每行多条记录,如电子相册(含分页)

    Repeat
    优缺点:1.控件完全以HTML方式呈现,更加个性化
                    2.不支持分页、编辑和排序功能
                    3.开发周期最长 
                    4.不提供默认的风格,需手工编写
                    5.性能最好,但特性最少
    使用范围:主要用于一些灵活性、性能更高的数据展现。

    Datagrid整体介绍:
    Datagrid类似于数据库的表格,记录集由行集(items)和列集(columns)组成,行集由多个datagridColumn组成,列集由多个datagriditem组成。
    工作原理:1.dataset取得数据,2.指定datagrid的数据源为dataset,3.datagrid绑定数据。在绑定数据的时候,自动加载datagrid列。创建之后,调用两个事件,ItemCreated和ItemDataBound创建行。
    datagrid有两个对象,datagridColumn(代表一列)和Datagriditem(代表一行)。
    每个行集中有ListItemType,有以下几种类型:Header,Footer,Item,AlernatingItem,SelectedItem,EditItem,Separastor,Pager。
    列集有以下几种类型:BoundColumn,HyperLinkColumn,ButtonColumn,TemplateColumn。
    如果Datagrid有子控件,那么Datagrid是通过ItemCommand事件获取控件的。

    DatagridColumn的介绍:
    1.绑定列:BoundColumn,文本字段标准显示,当处于编辑状态,将显示为TextBox
    2.按钮列:包括选择按钮,删除按钮,更新按钮,编辑按钮,普通按钮,每种按钮都有相对应的事件,有两种3.按钮样式风格,LinkButton和PushButton
    3.超链接列
    4.模板列:TemplateColumn,完全控制哪些控件显示给用户,分为多种模板,有HeaderTemplate,ItemTemplate,EditiItemTemplate,FooterTemplate。非模板列均可以转换为模板列来增加更灵活的功能。
    5.编辑命令列
    以上列都继承于DataGridColumn。

    实例演示:1.在页面中拖放一个Datagrid控件
                        2.拖放一个SqlDataAdapter
                        3.生成数据集
                        4.配置Datagrid属性,配置数据源,数据成员和数据键字段(按哪个主键绑定),配置列,生成顺序是先生成自定义列,再生成自动生成的列
                        5.在Page_Load事件中书写代码
                           if (!Page.IsPostBack)
                           {
                              sqlDataAdapter1.Fill(dsCustomers1);
                              DataGrid1.DataBind();
                            }
                        6.添加编辑,更新,取消,删除操作按钮,为这些按钮编写事件

    void bindData()
      {
       sqlDataAdapter1.Fill(dsCustomers1);
       DataGrid1.DataBind();
      }
     private void DataGrid1_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
      {
       DataGrid1.EditItemIndex=e.Item.ItemIndex; //设置当前行为编辑状态
       bindData();
      }

      private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
      {
      //首先取得行中的每个字段
       string CustomerID=e.Item.Cells[1].Text;      //非编辑状态
       string CompanyName=((TextBox)e.Item.Cells[2].Controls[0]).Text;       //编辑状态
       string ContactName=((TextBox)e.Item.Cells[3].Controls[0]).Text;
       string ContactTitle=((TextBox)e.Item.Cells[4].Controls[0]).Text;
       string Address=((TextBox)e.Item.Cells[5].Controls[0]).Text;
       string City=((TextBox)e.Item.Cells[6].Controls[0]).Text;
       string Region=((TextBox)e.Item.Cells[7].Controls[0]).Text;
       string Country=((TextBox)e.Item.Cells[8].Controls[0]).Text;
       sqlDataAdapter1.Fill(dsCustomers1);    //重新填充数据集
       dsCustomers.CustomersRow dr=dsCustomers1.Customers.FindByCustomerID(CustomerID);  //获取当前行
        //获取修改后的值
       dr.CompanyName=CompanyName;
       dr.ContactName=ContactName;
       dr.ContactTitle=ContactTitle;
       dr.Address=Address;
       dr.Region=Region;
       dr.Country=Country; 
       sqlDataAdapter1.Update(dsCustomers1); //更新数据集
       dsCustomers1.AcceptChanges();  //接受更新
       DataGrid1.EditItemIndex=-1;   //修改状态为非编辑状态
       bindData();  //重新绑定数据
      }

      private void DataGrid1_DeleteCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
      {
       string CustomerID=e.Item.Cells[1].Text; //获取此行主键
       sqlDataAdapter1.Fill(dsCustomers1);  //重新填充数据集
       dsCustomers.CustomersRow dr=dsCustomers1.Customers.FindByCustomerID(CustomerID);  //获取当前行
       dr.Delete();  //删除行
       sqlDataAdapter1.Update(dsCustomers1);  //更新数据集
       dsCustomers1.AcceptChanges();  //接受更新
       bindData();  //重新绑定
      }

      private void DataGrid1_CancelCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
      {
       DataGrid1.EditItemIndex=-1;
       bindData();
      }

    使用DataGrid注意事项:
    1.需要更大的灵活性时,建议不要使用自动生成列
    2.如果使用了自动生成列,并且在Datagrid中指定了列,那么最终得到列的重复设置。系统将首先显示特别声明的列,随后是所有自动生成的列。
    3.切忌不可仅使用控件ID来引用Datagrid项目中的控件,须用FindControl来指明。

    DataGridItem介绍
    注意事项:
    对于非模板列:datagriditem.Cells[第几个单元格].Controls[第几个控件]下标从0开始。可以转换成相应的控件:如boundColumn:Label  EditColumn :Textbox  LinkColumn:DataGridLinkButton
    当模板列时,Control的index必须都加1,因为Control[0]  LiteralControl="";
    建议:当知道控件ID值,建议采用datagriditem.findcontrol["控件名称"]来获得

    DataGridItem构建行的流程:可以分页时,itemCreated事件依次创建〔如果有分页〕Pager(表头页),Header(表头),Item(一行),AlternatingItem(交替行),Footer(脚注),〔如果有分页〕Pager页(表尾页)。如果按下了“编辑”按钮,则执行当前编辑按钮所处的行的EditItem,如果按下了选择按钮,则执行当前选择按钮所处的行的SelectedItem。

     Datagrid绑定事件的触发流程:
     1.DataBind绑定列,只要执行了DataBind方法,马上会激发这个方法。
    2.ItemCreated创建行 (行容器),可转换成DataRowView
    3.page.aspx页中的<%# 表达式%>
    4.ItemDataBound绑定行数据,将数据存放于行容器中(数据绑定),可转换成DataRowView
    5.加入items集合中,count属性+1,重复2-5过程
    6.数据加载完毕后,PreRender数据呈现。
    注意:如果在创建时手工添加自定义控件(不使用模板列),则需要在ItemCreated事件中绑定。

    DataGrid绑定事件的常见问题:
    1.引用e.Item.DataItem报错“对象不能为null"
    原因:没有在ItemCreated或ItemDataBound下判断行类型,(DataRowView)(e.Item.DataItem)只有在item行、AlternatingItem行、SelectedItem、EditItem项下才有值
    2.数据访问完后如何访问某行数据,可以使用datagriditem来搜索,代码结构如下:
       foreach (datagriditem dgi in Datagrid1.items){
    }
    切记不可用dgi.datagriditem来访问,因为在itembound之后已重新为null

    使用ItemCreated注意事项:当加载,修改行属性或行内的控件属性时,应该判断ItemType类型,因为每个单元格均有不同的项类型的呈现方式

    数据绑定浅谈:ASP.NET数据绑定语法仅在调用DataBind方法时计算,调用的变量必须声明public类型。
    简单属性:<%#custID%>,比如在Code behind声明了一个变量后需要在界面上显示的情况时使用
    集合:<asp:ListBox id="List1" datasource='<%#myArray%>' runat="server"/>
    表达式:<%# (customer.FistName+" "+customer.LastName)%>
    方法结果 <%#GetBalance(custID)%>

    模板列的数据绑定
    Container.DataItem容器方法:
    DataItem指的是Datagrid某一行,可通过类型转换成DataRowView,并可以获取该行中的每个单元,即DatagridItem和Container.DataItem功能相同。
    方法一:循环获取已绑定的datagrid中列名为CustomerID
    方法二:在绑定datagrid数据的过程中获取CustomerID(ItemDataBound事件),DataItem仅适用于DataGrid控件中的数据项,即ListItemType必须是Item,AlternatingItem,SelectedItem或EditItem才能访问,所以要加判断。)
    方法三:DataBinder.Eval 。<%#DataBinder.Eval(数据项的命名容器,数据字段名,格式字符串)%>,对于Datagrid,DataList,Repeater的命名容器:Container.DataItem。缺点:性能不高。


    ItemCommand事件
    模板列中的子控件的事件--“冒泡事件”。子控件调用ItemCommand事件,指定控件的CommandName,从而调用子控件事件代码。

    个性化分页技巧:默认的只有数字,可以在ItemCreated事件中的ItemType==ListItemType.Pager修改默认的呈现。


    实例1:模板列的使用。字段编辑模式时使用DropDownList。步骤:
    1.在界面上拖放一个Datagrid控件
    2.拖放一个sqlDataAdapter控件,设置sqlConnection,并生成数据集。
    3.设置该列为模板列
    4.添加Item和EditItem,在Item中绑定Container.DataItem中的某个字段,在EditItem中放置DropDownList,并绑定设置FieldName和FieldValue
    5.在DataGrid的ItemDataBound事件中填充需用于绑定DropDownList的数据集并绑定。注意:绑定之前先进行item类型判断,e.Item.ItemType==ListItemType.EditItem
    6.修改UpdataItem事件更新在下拉列表中更新的值,注意事先要设置下拉列表的ID,使用FindControl方法获得,Control的index必须都加1,因为Control[0]  LiteralControl=""。

    实例2:ItemCommand事件的使用。点击下拉表中的某个值,在页面上部显示所选的项。
    1.在DropDownList的SelectedValueChanged事件属性中定义用于处理的子事件的事件名。
    2.在后台代码中定义子事件函数,注意事件属性应为public,不然前台无法显示

    实例3:测试绑定列的流程
    1.在页面中增加一按钮
    2.添加按钮点击事件,显示添加到字符串的所有生成的行类型
    3.在ItemCreated事件中将每个生成行的属性添加到字符串中。

    实例4:插入一行。原理:新行在DataGrid的Footer中显示
    1.在页面中添加一按钮
    2.添加按钮事件,执行DataGrid1.ShowFooter=true;
    3.在ItemCreater中判断当类型为Footer时轮循每个单元格,设置需要放置的控件,为控件添加事件处理名和显示文本
    4.在DataGrid的ItemCommand事件中,对应每个CommandName,添加处理方法。比如对于Insert事件,需要添加新记录,并将ShowFooter属性设置为false,如果是取消,只需要将ShowFooter属性设置为false。

  • 相关阅读:
    22、Flyweight 享元模式
    js随机点名器(简单)
    js随机点名器(简单)
    PHP
    PHP
    Laravel框架实现利用监听器进行sql语句记录功能
    Laravel框架实现利用监听器进行sql语句记录功能
    PhpStorm常用的一些快捷键
    PhpStorm常用的一些快捷键
    HTTP状态码汇总
  • 原文地址:https://www.cnblogs.com/zgqys1980/p/1281873.html
Copyright © 2011-2022 走看看