`

动态模板列更新数据分页的例子

阅读更多
前台:
<%@ Page language="c#" Codebehind="WebForm30.aspx.cs" AutoEventWireup="false" Inherits="csdn.WebForm30" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>WebForm30</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name="vs_defaultClientScript" content="JavaScript">
<link href="css.css" rel="stylesheet" type="text/css">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:DataGrid ID="DataGrid1" Runat="server"></asp:DataGrid>
</form>
</body>
</HTML>
后台:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace csdn
{
/// <summary>
/// WebForm30 的摘要说明。
/// </summary>
public class WebForm30 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid DataGrid1;

private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if(!IsPostBack)
{
BindGrid();
}
CreateDataGrid();//进行一些DataGrid的设置
}

protected void CreateDataGrid()
{
DataGrid1.AutoGenerateColumns=false;//不启用自动生成列
DataGrid1.CssClass="border";//边框样式
DataGrid1.BorderWidth=0;
DataGrid1.CellSpacing=1;
DataGrid1.CellPadding=5;
DataGrid1.ItemStyle.CssClass="item";//普通列样式
DataGrid1.HeaderStyle.CssClass="header";//头样式
DataGrid1.PagerStyle.CssClass="header";//页脚样式
DataGrid1.DataKeyField="stuid";//主键字段
DataGrid1.AllowPaging=true;//允许分页
DataGrid1.PageSize=5;//分页大小
DataGrid1.PagerStyle.Mode=PagerMode.NumericPages;//数字形式分页
EditCommandColumn ecc=new EditCommandColumn();//更新按钮列
ecc.ButtonType=ButtonColumnType.PushButton;//下压按钮
ecc.EditText="编辑";
ecc.CancelText="取消";
ecc.UpdateText="更新";//按钮文字
DataGrid1.Columns.Add(ecc);//增加按钮列
DataGrid1.EditCommand+=new DataGridCommandEventHandler(DataGrid1_EditCommand);
DataGrid1.UpdateCommand+=new DataGridCommandEventHandler(DataGrid1_UpdateCommand);
DataGrid1.CancelCommand+=new DataGridCommandEventHandler(DataGrid1_CancelCommand);//更新、取消、编辑事件注册
DataGrid1.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(DataGrid1_PageIndexChanged);//分页事件注册,这里需要注意注册事件代码的位置,不能放到BindGrid()中
SetBind();//绑定数据
}

protected void BindGrid()
{
TemplateColumn tm=new TemplateColumn();
tm.ItemTemplate=new ColumnTemplate1();//普通列
tm.EditItemTemplate=new ColumnTemplate2();//编辑列
tm.HeaderText="姓名";
DataGrid1.Columns.AddAt(0,tm);//在第一列增加第一个模板列
TemplateColumn tm2=new TemplateColumn();
tm2.ItemTemplate=new ColumnTemplate3();
tm2.EditItemTemplate=new ColumnTemplate4();
tm2.HeaderText="学院";
DataGrid1.Columns.AddAt(1,tm2);//在第二列增加第一个模板列
DataGrid1.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(DataGrid1_ItemDataBound);//数据绑定事件注册,这里需要注意注册事件代码的位置
SetBind();
}

protected void SetBind()
{
SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
SqlDataAdapter da=new SqlDataAdapter("select * from stu,dep where stu.studepid=dep.depid",conn);
DataSet ds=new DataSet();
da.Fill(ds,"table1");
this.DataGrid1.DataSource=ds.Tables["table1"];
this.DataGrid1.DataBind();

}

private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
SqlDataAdapter da=new SqlDataAdapter("select * from dep",conn);
DataSet ds=new DataSet();
da.Fill(ds,"table1");
if(e.Item.ItemType==ListItemType.EditItem)
{
DropDownList ddl=(DropDownList)e.Item.FindControl("dep");
ddl.DataSource=ds.Tables["table1"];
ddl.DataTextField="depname";
ddl.DataValueField="depid";
ddl.DataBind();
ddl.Items.FindByValue(Convert.ToString(DataBinder.Eval(e.Item.DataItem,"depid"))).Selected=true;
}
}

private void DataGrid1_EditCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
this.DataGrid1.EditItemIndex=e.Item.ItemIndex;
BindGrid();
}

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

private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
string uid=e.Item.UniqueID+":";//注意别遗漏冒号
SqlConnection conn=new SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);
SqlCommand comm=new SqlCommand("update stu set stuname=@name,studepid=@depid where stuid=@id",conn);
SqlParameter parm1=new SqlParameter("@name",SqlDbType.NVarChar,50);
parm1.Value=Request.Form[uid+"name"].ToString();
SqlParameter parm2=new SqlParameter("@depid",SqlDbType.Int);
parm2.Value=Request.Form[uid+"dep"].ToString();;
SqlParameter parm3=new SqlParameter("@id",SqlDbType.Int);
parm3.Value=this.DataGrid1.DataKeys[e.Item.ItemIndex];
comm.Parameters.Add(parm1);
comm.Parameters.Add(parm2);
comm.Parameters.Add(parm3);
conn.Open();
comm.ExecuteNonQuery();
conn.Close();
this.DataGrid1.EditItemIndex=-1;
BindGrid();
//之所以不能采用以前的((TextBox)e.Item.FindControl("name")).Text来取得数据时因为,DataGrid列是动态添加的,根本取不到
}

private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
this.DataGrid1.CurrentPageIndex=e.NewPageIndex;
BindGrid();
}

#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion
}

public class ColumnTemplate1 : ITemplate
{

public void InstantiateIn(Control container)
{
LiteralControl l = new LiteralControl();
l.DataBinding += new EventHandler(this.OnDataBinding);
container.Controls.Add(l);
}

public void OnDataBinding(object sender, EventArgs e)
{
LiteralControl l = (LiteralControl) sender;
DataGridItem container = (DataGridItem) l.NamingContainer;
l.Text = ((DataRowView)container.DataItem)["stuname"].ToString();
}
}

public class ColumnTemplate2 : ITemplate
{
public void InstantiateIn(Control container)
{
TextBox t = new TextBox();
t.Width=88;
t.ID="name";//需要给一个id,在Request.Form的时候可以取
t.DataBinding += new EventHandler(this.OnDataBinding);
container.Controls.Add(t);
}

public void OnDataBinding(object sender, EventArgs e)
{
TextBox t= (TextBox) sender;
DataGridItem container = (DataGridItem) t.NamingContainer;
t.Text = ((DataRowView)container.DataItem)["stuname"].ToString();//绑定stuname字段
}
}

public class ColumnTemplate3 : ITemplate
{
public void InstantiateIn(Control container)
{
LiteralControl l = new LiteralControl();
l.DataBinding += new EventHandler(this.OnDataBinding);
container.Controls.Add(l);
}

public void OnDataBinding(object sender, EventArgs e)
{
LiteralControl l = (LiteralControl) sender;
DataGridItem container = (DataGridItem) l.NamingContainer;
l.Text = ((DataRowView)container.DataItem)["depname"].ToString();
}
}

public class ColumnTemplate4 : ITemplate
{
public void InstantiateIn(Control container)
{
DropDownList dpl = new DropDownList();
dpl.ID="dep";
container.Controls.Add(dpl);
}//这里没有为这个下拉框进行数据绑定,在DataGrid1的ItemDataBound中进行了这个操作
}
}

代码比较简单,在代码中有注释简单的解释。
补充2点:(1)这次的DataGrid是在设计生成的,不是上次的运行时,后者会造成更新的紊乱;(2)处于简单,代码中模板列类没有很好的封装,在运用的时候还是应该对字段和模板列类型(ListItemType)进行封装

分享到:
评论

相关推荐

    两套bootstrap5框架后台管理模板 - Amdash

    Amdash是基于Bootstrap5框架实现的后台管理模板。...数据表分页和排序 不同形式的布局 验证表单 滑块范围 表单向导 用户信息页面 不同类型的通知和甜蜜的警报 登录/注册页面 兼容小型、中型和大型屏幕

    dwz官方例子

    dwz官方例子 开发环境: 1) 数据库:mysql 请修改 src/hibernate_mysql.cfg.xml这个文件的数据库连接 创建数据库dwz4j 导入测试数据:db/dwz4j.sql mysql -u root -p dwz4j 2) JDK 1.6 3) 项目文件UTF-8编码,如果...

    MVC2.0项目模板0.2版源码

    MVC2.0项目模板0.2版源码 2010年06月08日 更新 增加用户选择主题功能,暂时无缩略图 2010年05月20日 更新 增加了一个文章管理模块(实例) 增加左右树结构分类 增加初期模板功能 增加文件上传功能 增加...

    工厂模式三层架构增删改查分页(BLL层使用事务)源码

    程序通过WinForm应用程序实现Sql Server 2005,Sqlite 3的增、删、改、查,分页功能。是学习三层架构、工厂模式,操作Sql Server和Sqlite数据库的极佳学习例子。本源码是我开发一个10万行代码软件时使用的架构的进化...

    ASP.NET数据表现控件

    网格式表现数据,支持分页.独创的支持存储过程分页. 2.可删除记录,并根据用户设定的条件决定是否可删除 3.可选择记录,提交后记忆选择行 4.设置记录模板,可以实现任意样式布局的网页 5.标志符合条件的某项 6.完全...

    蓝梦分页控件 1.0.7.420

    分页显示信息可以定制模板。 &lt;br/&gt;10.同时支持 .Net 1.1 和 .Net 2.0 &lt;br/&gt; 更多特性未能详列。 &lt;br/&gt; 未来版本: &lt;br/&gt;1.增加数字按钮图片模式。 &lt;br/&gt;2.增加Ajax支持。 &lt;br/&gt;3....

    EXT简体中文参考手册(PDF&CHM电子档)

    第二步,将数据加入到模板中 62 下一步 63 学习利用模板(Templates)的格式化功能 63 正式开始 63 下一步 64 事件处理 64 非常基础的例子 64 处理函数的作用域 64 传递参数 65 类设计 66 对象创建 66 使用构造器...

    Ext 学习中文手册

    第二步,将数据加入到模板中 62 下一步 63 学习利用模板(Templates)的格式化功能 63 正式开始 63 下一步 64 事件处理 64 非常基础的例子 64 处理函数的作用域 64 传递参数 65 类设计 66 对象创建 66 使用构造器...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例231 文本文件的分页读取 298 4.4 文件操作 300 实例232 文件操作汇总 300 实例233 目录、文件定位器 302 实例234 改头换面 303 实例235 文件属性分析 304 实例236 文件类型检测 306 实例237 判断文件的权限 308 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例231 文本文件的分页读取 298 4.4 文件操作 300 实例232 文件操作汇总 300 实例233 目录、文件定位器 302 实例234 改头换面 303 实例235 文件属性分析 304 实例236 文件类型检测 306 实例237 判断文件的权限 308 ...

    YTDataGrid

    网格式表现数据,支持分页.独创的支持存储过程分页. 2.可删除记录,并根据用户设定的条件决定是否可删除 3.可选择记录,提交后记忆选择行 4.设置记录模板,可以实现任意样式布局的网页 5.标志符合条件的某项 6.完全...

    codesmith的 例子

    用codesmith完成的表的增删改查(分页,主键)存储过程

    黑马品优购项目

    前端:三级联动、富文本、图片上传、动态生成内容 4.3.2. 商品修改 需要从3张表获取数据,然后进行回显。 4.4. 典型模块设计 4.4.1. 管理后台 商品新增、商品修改 4.4.2. 前台页面 搜索模块实现 购物车模块实现 ...

    asp.net知识库

    ADO.NET 2.0 大批量数据操作和多个动态的结果集 ADO.NET 2.0 异步处理 在ASP.NET中使用WINDOWS验证方式连接SQL SERVER数据库 改进ADO.Net数据库访问方式 ASP.NET 2.0 绑定高级技巧 简单实用的DataSet更新数据库的类+...

    volcano-table:Meteor 的可编辑数据表包

    ##特征仅在需要时将数据下载到客户端适用于非常大的数据集编辑现有记录添加新记录删除记录数据验证过滤分页排序##例子安装meteor add wilbur:volcano-table ##用法要使用火山表只包括volcanoTable现有模板的...

    在ASP.NET 2.0中操作数据之二十九:用DataList和Repeater来显示数据

     在之前的28篇教程的例子里,如果我们需要显示某个数据源的多条记录,我们使用GridView .GridView 的一行表示数据源的一条记录,列表示一个字段.虽然GridView 用来显示数据,分页,排序,编辑,删除非常的方便,但是有点...

    EXT 中文帮助手册

    58 练一练 60 动态添加菜单按钮到Toolbar 61 更方便的是 61 下一步是 62 模板(Templates)起步 62 第一步 您的HTML模板 62 第二步,将数据加入到模板中 62 下一步 63 学习利用模板...

    EXT 中文手册

    58 练一练 60 动态添加菜单按钮到Toolbar 61 更方便的是 61 下一步是 62 模板(Templates)起步 62 第一步 您的HTML模板 62 第二步,将数据加入到模板中 62 下一步 63 学习利用模板...

Global site tag (gtag.js) - Google Analytics