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。

  • 相关阅读:
    HDU 1058 Humble Numbers
    HDU 1160 FatMouse's Speed
    HDU 1087 Super Jumping! Jumping! Jumping!
    HDU 1003 Max Sum
    HDU 1297 Children’s Queue
    UVA1584环状序列 Circular Sequence
    UVA442 矩阵链乘 Matrix Chain Multiplication
    DjangoModels修改后出现You are trying to add a non-nullable field 'download' to book without a default; we can't do that (the database needs something to populate existing rows). Please select a fix:
    opencv做的简单播放器
    c++文件流输入输出
  • 原文地址:https://www.cnblogs.com/zgqys1980/p/1281873.html
Copyright © 2011-2022 走看看