`
kaidi0314
  • 浏览: 86175 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

DataGrid Web Control 连载之八

    博客分类:
  • flex
 
阅读更多
http://www.diybl.com/course/1_web/webjs/20100710/404415.html

在类似于Microsoft Hotmail的应用程序中,用户可以通过勾选CheckBox选中多项,然后对所有选中的项进行操作,如删除或复制它们。
为了添加这样的功能,要在DataGrid中添加一个模板列,并在该模板列中加一个CheckBox。当页面运行的时候,用户就可以对他们需要的项进行选择。
实际执行用户的动作时,可以遍历DataGrid的Items集合检查适当的列(单元格)来看CheckBox是否被选中,下面的例子显示了如何根据用户的选择来删除DataSet中的行。假设数据集.dsBook中包含了一个Books表。
private void btnDelete_Click(object sender, System.EventArgs e)
{
   int i = 0;
   CheckBox cb;
   int bookid;
   dsBooks.BooksRow dr;
   foreach(DataGridItem dgi in this.DataGrid1.Items)
   {
      cb = (CheckBox) dgi.Cells[0].Controls[1];
      if(cb.Checked)
      {
         // Determine the key of the selected record ...
         bookid = (int) DataGrid1.DataKeys;
         // ... get a pointer to the corresponding dataset record ...
         dr = this.dsBooks1.Books.FindBybookid(bookid);
         // ... and delete it.
         dr.Delete();
      }
      i++;
   }
   this.sqlDataAdapter1.Update(this.dsBooks1);
   this.sqlDataAdapter1.Fill(this.dsBooks1);
   DataGrid1.DataBind();
}
需要注意的几点:
你可以通过下面的标准方法来检查CheckBox是否被选中:为从模板列中得到控件值,首先要从单元格的控件集合中得到一个对象,并且进行适当的类型转换。如果你得到了一个CheckBox控件,要记住它通常是第二个(索引为1)控件,因为在它前面有一个文字控件(即使它为空)。
如果你要删除一个记录,必须通过DataSet中的关键字来实现,而不是通过offset。DataGrid控件中项的索引可能并不与表中同样记录的索引匹配,即使开始时匹配在删除第一条记录后就不再匹配了,这里代码通过DataGrid的DataKey集合得到记录的关键字,然后通过在DataSet表中使用FindByKey()方法来实现要删除的记录。
在DataSet中的记录被删除后(技术上,它们只是被做了删除标记),你要调用DataAdapter的Updata方法来从数据库中实际删除他们,然后代码从数据库刷新DataSet并重绑定回DataGrid.
一次编辑多行
DataGrid控件中编辑行的标准方法是通过添加一个“编辑、更新、取消”按钮到DataGrid的列中,只允许用户一次编辑一行,如果用户要编辑多行,他们必须单击“编辑”按钮,然后修改,再点击“更新”按钮,每一行都要这么做。
在某些情况下,一个有效的变通方法就是配置DataGrid使它默认就是编辑模式,这种情形DataGrid总是通过TextBox或者其它控件来显示可编辑的数据。用户不需要再将其转为编辑模式,典型情况下,用户作出任何想要的更改,然后单击一个按钮(并不是DataGrid中的按钮)来一次提交所有的更改。
你可以在任何数据模型下使用这种编辑方式,无论是通过DataSet或者直接通过数据命令使用数据源。为将DataGrid设定为多行可编辑模式,添加列并将所有可编辑列转化为模板列,在DataGrid生成器中的列标签中,选中一列,选择窗口底部的“将此列转化为模板列”,可以通过右键→编辑模板来对模板进行编辑。
添加编辑控件项模板,注意你不是像通常那样将它们添加到编辑项模板,因为在编辑模式下,行不会被显示,也就是说,在ItemTemplate中才包含可编辑控件。
像一般情况下那样设定数据绑定,你需要单独为每个可编辑控件进行绑定,一个典型的数据绑定表达式可能是这样:DataBinder.Eval(Container,”DataItem.title”)
加载DataGrid与一般情况无异,但是更新时稍有不同,当用户点击更新按钮时,你需要遍历整个DataGrid,一项一项地从可编辑控件中提取值,并将其指定给命令的参数,然后为每一项执行更新操作‘
private void btnUpdate_Click(object sender, System.EventArgs e)
{
   int i;
   DataGridItem dgi;
   int bookid;
   TextBox TextBoxTitle;
   CheckBox CheckBoxInStock;
   TextBox TextBoxPrice;

   for(i = 0; i <= DataGrid1.Items.Count -1 ; i++)
   {
      dgi = DataGrid1.Items;
      Label LabelBookId = (Label) dgi.Cells[0].Controls[1];
      bookid = int.Parse(LabelBookId.Text);
      TextBoxTitle = (TextBox) dgi.FindControl("TextBoxTitle");
      CheckBoxInStock = (CheckBox) dgi.FindControl("CheckBoxInStock");
      TextBoxPrice = (TextBox) dgi.FindControl("TextBoxPrice");
      this.dcmdUpdateBooks.Parameters["@bookid"].Value = bookid;
      this.dcmdUpdateBooks.Parameters["@Title"].Value = TextBoxTitle.Text;
      this.dcmdUpdateBooks.Parameters["@instock"].Value =
CheckBoxInStock.Checked;
      this.dcmdUpdateBooks.Parameters["@Price"].Value =
float.Parse(TextBoxPrice.Text);
      this.sqlConnection1.Open();
      this.dcmdUpdateBooks.ExecuteNonQuery();
      this.sqlConnection1.Close();
   }
}
检查出变化的项
上面展示的更新策略的一个不足之处在于:如果只有很少的行发生变更,那么为每一行(无论变化与否)都向DataSet或者数据库发出更新命令,效率是比较低的,如果你使用的是一个DataSet,那么可以添加逻辑来检查DataGrid的控件与DataSet行中的对应列之间是否有变化,如果像上例那样,没有使用DataSet,就不能很容易地做出比较,因为那将涉及一次数据库的访问与回传。
对于以上两种数据源都适应的一个策略是,确定一个能在你做出更新之前就能检查出该行是否为“脏数据”的方法,实现它的一个确定的方法是处理行中控件的Changed事件,相似地,对于CheckBox控件,可以使用其CheckedChanged事件。
在这些事件的处理中你可以保持一个将要更新的行的列表。通常,最好的方法是保持手影响的行的主键。比如:可以声明一个ArrayList对象来存储将要更新的行的主键。
假如要为上面的例子采用这样的策略,创建一个ArrayList对象的实例作为Page类的一个成员。
Protected  ArrayList bookidlist = new ArrayList();
然后创建一个事件处理程序,在控件发生变化时,向ArrayList对象中添加书的ID。下面的代码是一个当TextBox产生TextChanged事件成一个CheckBox产生CheckedChanged事件时触发的一个。事件处理程序:
protected void RowChanged( object sender, System.EventArgs e)
{
   DataGridItem dgi = (DataGridItem)(((Control)sender).NamingContainer);
   Label bookidlabel = (Label) dgi.Cells[0].Controls[1];
   int bookid = int.Parse(bookidlabel.Text);
   if (!bookidlist.Contains(bookid))
   {
      bookidlist.Add(bookid);
   }
}
注意:方法不能声明为private,否则后面就不能对其绑定。
默认情况下,change事件并不将page回传到服务器,理解这点是十分有益的,经常是页面通过其它某种方式提交的时候才触发该事件(通过单击事件)。在页面处理过程中,页面和其上的所有控件被初始化,然后所有的change事件被触发。只有当change事件处理程序完成,控件的click事件发生,才引起页面的回传。
在上面的RowChanged方法中,代码需要从当前项获得书的ID,但它并不把该项传给你(就象许多DataGrid事件一样),因此你要解决这个问题,由事件的Sender参数获得它的NamingContainer属性,也就是DataGrid项,由DataGrid项向下通过Cell.controls就可以得到用于显示书的ID的Label控件的值。
在加入前需要检查书的ID尚未存在于数组中,行中的每个控件都单独产生一个事件,所以如果行中多于一个控件发生了change事件,就可以防止多项向数组中添加该书的ID号。
控件的change事件总是在click事件之前被触发和处理。因此,你可以在change事件中创建ArrayList,并要确保它在用于提交表单的按钮的click事件处理程序(本例中是btnUpdate_click)执行时是可用的。
既然你已经有了ArrayList,现在可以对管理更新的事件处理程序进行一个小的修改,在btnUpdate_click事件中,对DataGrid项循环时,添加一个判断,来检查当前的书的ID号是否是已经在ArrayList中,如果在,则执行更新:
private void btnUpdate_Click(object sender, System.EventArgs e)
{
   int i;
   DataGridItem dgi;
   int bookid;
   //Rest of declarations here

   for(i = 0; i <= DataGrid1.Items.Count -1 ; i++)
   {
      dgi = DataGrid1.Items;
      TableCell tc = dgi.Cells[0];
      string s = dgi.Cells[0].Text;
      Label LabelBookId = (Label) dgi.Cells[0].Controls[1];
      bookid = int.Parse(LabelBookId.Text);
      if (bookidlist.Contains(bookid))
      {
         // Update code here
      }
   }
}
还有一个任务:绑定处理程序列控件的事件,在VS中,只有通过HTML视图来完成,控件在后台代码(code-behind)文件中并没有默认地实例化,因此,代码工具并不支持它们,将.aspx文件切换到HTML视图,在每个控件的声明元素中添加下面的语法:
<asp:TemplateColumn HeaderText="title">
   <ItemTemplate>
      <asp:TextBox OnTextChanged="RowChanged"
         id=TextBoxTitle runat="server"
         Text='<%# DataBinder.Eval(Container, "DataItem.title") %>'>
      </asp:TextBox>
   </ItemTemplate>
</asp:TemplateColumn>

<asp:TemplateColumn HeaderText="instock">
   <ItemTemplate>
      <asp:CheckBox id=cbInStock OnCheckedChanged="RowChanged"
        runat="server"
        Checked='<%# DataBinder.Eval(Container, "DataItem.instock") %>'>
      </asp:CheckBox>
   </ItemTemplate>
</asp:TemplateColumn>
TextBox和CheckBox均可以在各自的change事件触发时调用相同的方法,因为两个事件句柄具有同样的签名(signature),对于一个ListBox的控件或TextBox和CheckBox均可以在各自的change事件触发时调用相同的方法,因为两个事件句柄具有同样的签名。对于一个ListBox控件或Drop-Down List控件也是如此,它们的SelectedIndexChanged事件也传递相同的参数。
分享到:
评论

相关推荐

    DataGrid导出EXCEL的几个方法(WebControl).rar

    本资源"DataGrid导出EXCEL的几个方法(WebControl).rar"似乎提供了几种不同的方法来实现这个功能。接下来,我们将详细探讨几种常见的DataGrid数据导出到Excel的方法。 1. **Response.Write和HTML表格** 这是最...

    DataGrid Web控件深度历险

    在探讨DataGrid Web控件的深度历险之旅中,我们已经初步了解了其基本功能——即如何在HTML表格中展示数据。DataGrid是一个强大的ASP.NET Web控件,用于在网页上呈现复杂的数据集。在前一部分中,我们学习了如何通过...

    DataGrid导出EXCEL的几个方法(WebControl)

    在Web开发中,将数据导出为Excel格式是常见的需求之一,尤其是当涉及到大量数据分析和报表制作时。本文将详细解析如何使用ASP.NET中的DataGrid控件实现数据导出至Excel的功能。此过程主要涉及以下几种方法: #### ...

    easyui datagrid 表格 打印

    在IT领域,EasyUI Datagrid是一款基于jQuery的前端数据展示组件,它提供了丰富的表格功能,如数据分页、排序、筛选等。当我们需要将Datagrid中的数据进行打印时,可能会遇到一些挑战,因为通常默认的浏览器打印功能...

    C#WPF之DataGrid用法

    数据绑定是DataGrid的核心功能之一,主要分为自动生成功能与用户自定义两种方式。 ##### 1. 自动生成列 当`AutoGenerateColumns`属性设置为`True`时,DataGrid会根据数据源自动为每个字段生成一个列。这种方式简单...

    jeasyui-datagrid-datagrid

    在Web应用开发中,数据展示和交互是核心部分之一,而DataGrid作为数据展示的利器,深受开发者喜爱。JeasyUI DataGrid是一款基于jQuery的轻量级组件,它为开发者提供了丰富的功能,如数据分页、排序、过滤等,极大地...

    DataGrid中嵌套DataGrid

    而"DataGrid中嵌套DataGrid"是一种复杂但非常实用的技术,它允许在一个DataGrid的行或列中内嵌另一个DataGrid,以展示层次化数据或相关联的数据集。这种技术同样适用于DataGrid与DataList,以及DataList之间的嵌套,...

    bootstrap的datagrid组件

    总的来说,Bootstrap的DataGrid组件是Web开发中的一个强大工具,它集成了数据展示、操作和检索的核心功能,能够帮助开发者快速构建数据驱动的用户界面,提升应用的用户体验。通过熟练掌握和灵活运用,开发者可以创建...

    datagrid-dnd(可以拖放的datagrid)

    在IT行业中,datagrid是一种常用的组件,它用于展示和管理大量结构化的数据,通常在Web应用中使用。在本例中,我们关注的是一个名为"datagrid-dnd"的特性,这是一项允许用户通过拖放操作来重新排列数据网格行的功能...

    WPF之DataGrid使用示例

    在Windows Presentation Foundation (WPF) 中,`DataGrid` 是一个强大的控件,用于展示和编辑数据集。这个控件提供了灵活的布局选项,可以显示表格形式的数据,并且支持多种操作,如排序、分页、筛选和编辑。下面将...

    WPF DataGrid合并单元格(模板列嵌套DataGrid)

    在WPF(Windows Presentation Foundation)开发中,DataGrid控件是一种常用的数据展示工具,它可以方便地展示和操作表格数据。本教程将详细讲解如何在DataGrid中实现单元格的合并,以及如何在模板列中嵌套另一个...

    给DataGrid自定义Header功能

    在开发Web应用时,我们经常使用DataGrid组件来展示数据,它是一种强大的表格展示工具,尤其在处理大量数据时。然而,DataGrid的默认功能往往无法满足所有需求,这时我们就需要进行自定义扩展,比如自定义Header。...

    EasyUI的DataGrid显示ASP.NET内容

    EasyUI的DataGrid是一款基于jQuery的轻量级前端数据展示组件,它被广泛应用于Web应用中,用于展示和操作结构化的数据。在结合ASP.NET框架时,DataGrid能有效地将服务器端的数据动态地呈现到客户端,提供排序、分页、...

    WPF中DataGrid主从数据(父子数据)展示

    在WPF(Windows Presentation Foundation)应用开发中,DataGrid控件是用于显示和操作表格数据的强大工具。在处理复杂的数据关系时,如主从数据(父子数据)的关系,DataGrid可以提供灵活的显示方式,使得用户能清晰...

    datagrid 接收数据常用方法

    datagrid控件在IT界,尤其是Web开发中是一个非常常见的组件,它用于展示表格形式的数据,让用户可以方便地浏览、操作和管理大量信息。在本文中,我们将深入探讨datagrid接收数据的一些常用方法,这些方法适用于各种...

    datagrid 的用法

    在.NET框架中,DataGrid控件是一个非常重要的数据展示组件,尤其在早期的Web应用程序开发中,它被广泛用于显示和操作表格数据。本教程将详细介绍DataGrid的使用方法,适用于初学者,帮助你们快速掌握这个基础但实用...

    datagrid

    在Web开发或桌面应用中,DataGrid是一种常见的控件,它允许用户以表格的形式查看、编辑和管理数据。这篇博客的链接虽然没有提供具体内容,但我们可以根据DataGrid的基本概念和常见特性来探讨相关知识点。 1. **数据...

    打印DataGrid数据实例

    在.NET框架中,`DataGrid`控件是一个用于显示数据集或数据源的表格视图。这个实例将探讨如何利用C#编程语言和XPS(XML Paper Specification)格式来实现`DataGrid`数据的打印功能。XPS是一种开放标准,用于定义电子...

    DataGrid自定义列标题

    在.NET框架中,WPF(Windows Presentation Foundation)提供了一个强大的数据呈现控件——DataGrid,它用于显示和编辑网格形式的数据。在实际开发中,我们经常需要根据需求对DataGrid的列标题进行自定义,以增强界面...

    datagrid-detailview.js datagrid-bufferview.js datagrid-groupview.js

    总的来说,EasyUI的datagrid视图功能为Web开发提供了强大的数据展示和交互能力。通过DetailView、BufferView、GroupView、ScrollView和DefaultView,开发者可以根据需求灵活地构建数据密集型应用,提升用户体验。...

Global site tag (gtag.js) - Google Analytics