datagrid 动态生成模版列

gglqaq 2005-03-15 03:55:03
我想做通用表管理,根据传递表名,动态生成SQL,并绑定到DataGrid上,并要求第一列是选择列(关联表中的某个字段),选择后可以根据需要,修改、删除。另:datagrid 需要分页。
请问:该如何实现?
1.LinkButton的ID如何设置
2.Datagrid的数据是动态生成的,为何不能用if(Page.IsPostBack){ BindData() },如果用了,在PageIndexChanged事件中就无法分页显示了
我用的如下的 ITemplate。已经能够基本显示
public class GenericItem : ITemplate
{
private string column;
//private bool validate;
public GenericItem(string column)
{
this.column = column;
}
public void InstantiateIn(Control container)
{
LinkButton l = new LinkButton();
l.DataBinding += new EventHandler(this.BindData);
container.Controls.Add(l);
}

public void BindData(object sender, EventArgs e)
{
LinkButton l = (LinkButton) sender;
DataGridItem container = (DataGridItem) l.NamingContainer;
l.Text = ((DataRowView) container.DataItem)[column].ToString();
l.CommandName="Select";

}
}

...全文
140 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kaiqiao521 2005-03-16
  • 打赏
  • 举报
回复
http://218.27.204.17/aspnet/a_user.aspx
gglqaq 2005-03-16
  • 打赏
  • 举报
回复
在PageIndexChanged事件中,如果再次绑定,就显示重复了,显示了两次,各位有没有用以上的事例做过分页啊,是分页。。。
gglqaq 2005-03-16
  • 打赏
  • 举报
回复
现在的关键问题是DataGrid分页,动态创建的东东不能放到if(!Page.IsPostBack){}里,而在PageIndexChanged事件里,也需要绑定的,造成了二次绑定,显示上也重复了。
windancer 2005-03-16
  • 打赏
  • 举报
回复
把动态生成模版列的过程写到Page_init里面
luckyprg 2005-03-16
  • 打赏
  • 举报
回复
在Item初始时遍历DataGridItem中的LinkButton,一一设置即可。
gglqaq 2005-03-16
  • 打赏
  • 举报
回复
啥意思?
fenglik 2005-03-16
  • 打赏
  • 举报
回复
;i[
gglqaq 2005-03-16
  • 打赏
  • 举报
回复
to kaiqiao521:
连不上
up,高手呢?等待......
SeeSunSet 2005-03-15
  • 打赏
  • 举报
回复
动态创建DataGrid的模版列

有的时候我们需要邦定很复杂的DataGrid,我们知道DataGrid,DataList等控件都有Template列,我们可以通过动态的邦定模版列来实现,复杂逻辑的邦定。由于Page继承TemplateControl,所以在Page对象里面就可以使用TemplateControl类里面的方法LoadTemplate,我们可以利用这个方法加载指定路径用户控件来实现丰富的表示(顺便提一下还有一个LoadControl的方法和LoadTemplate有相同的参数类型,也就是说我们可以利用LoadControl方法动态的加载用户控件,可以实现自定义的用户界面,将页面元素分成一些小的用户控件可以根据用户的定义来加载),我们还可以实现Itemplate接口实现摸版列的动态邦定。

1、使用LoadTemplate实现:

下面我们看一个例子,我们建立一个ASP.NET的Web应用程序,在添加一个ascx的用户控件叫webusercontrol1.ascx如下所示,该用户控件里面只有一个Label控件用来邦定一个Lastname字段:

<%@ Control Language="C#" %>

<asp:label ID="label1" Runat="server" text='<%# Databinder.Eval(((DataGridItem)Container).DataItem,"lastname")%>'></asp:label>

接下来我们将要创建一个DataGrid控件DataGrid1,我们将在Page_Load事件里面添加如下的代码:

string connstr = @"Integrated Security=SSPI;User ID=sa;Initial Catalog=Northwind;Data Source=MyServer\NetSDK";

SqlConnection cnn=new SqlConnection(connstr);

SqlDataAdapter da=new SqlDataAdapter("select * from employees", cnn);

DataSet ds=new DataSet();

da.Fill(ds, "employees");

ITemplate temp= Page.LoadTemplate("webusercontrol1.ascx");

TemplateColumn tc=new TemplateColumn();

tc.HeaderText = "Last Name";

tc.ItemTemplate = temp;

DataGrid1.Columns.Add(tc);

DataGrid1.DataSource = ds;

DataGrid1.DataMember = "employees";

DataGrid1.DataBind();

先面我们分析一下上面的代码,我们使用一个SQL Server里面自带的示例数据库Northwind。我们将得到所有的员工信息,然后填充数据集,然后我们声明一个Itemplate类型的对象temp用来装载邦定的用户控件。我们在声明一个TemplateColumn来动态创建一个模版列,接下来我们给该模版列添加信息,其中包括HeaderText等等,由于我们将要邦定的事ItemTemplate所以我们将刚才装载的temp赋值给该模版列的ItemTemplate对象,最后我们就将新的摸版列添加到DataGrid里面并邦定数据。

注意到上面过程,我们的用户控件里面有一个数据邦定的Label这个很重要,只有这样我们才能实现数据邦定的功能,否则就是显示一个有着相同信息的列。

2、使用Itemplate实现:

上面我们使用LoadTemplate实现动态摸版列的邦定,接下来我们将使用Itemplate接口来实现。Itemplate接口有一个方法InstantiateIn(Control container)。这个方法必须指定摸版列的父亲控件。下面的代码将会实现Itemplate接口,我们使用下面的代码创建一个新的类:

using System;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Data;


namespace DynamicDataGridTemplates{

public class CTemplateColumn:ITemplate{

private string colname;

public CTemplateColumn(string cname){

colname=cname;

}

//为了使用接口必须实现的方法

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)[colname].ToString();

}

}

}

在构造函数里面我们为邦定列指定了列名。我们使用InstantiateIn创建了一个LiteralControl控件l,同时我们为这个控件添加事件邦定事件,这样我们可以在邦定DataGrid的时候可以处理邦定这个控件,同时为了实现事件邦定事件,我们还编写了事件处理函数OnDataBinding,在这里我们将用指定的列邦定数据。

接下来我们将我们的自定义的摸版列动态的添加到DataGrid里面,如下的代码是Page_Load里面的:

DataGrid datagrid1=new DataGrid();

TemplateColumn tc1=new TemplateColumn();

tc1.ItemTemplate=new CTemplateColumn("lastname");

tc1.HeaderText="Last Name";

datagrid1.Columns.Add(tc1);

Page.Controls[1].Controls.Add(datagrid1);

string connstr = @"Integrated Security=SSPI;User ID=sa;Initial

Catalog=Northwind;Data Source=MyServer\NetSDK";

SqlConnection cnn=new SqlConnection(connstr);

SqlDataAdapter da=new SqlDataAdapter("select * from employees", cnn)

DataSet ds=new DataSet();

da.Fill(ds, "employees");

datagrid1.DataSource = ds;

datagrid1.DataMember = "employees";

datagrid1.DataBind();

首先我们New一个DataGrid出来,然后声明一个模版列tc1,在设置tc1的ItemTemplate为我们自定一个模版列(不要忘了用列名这个参数),然后指定这个模版列的其他信息,最后利用DataSet邦定数据(不要忘了将控件添加到它的父控件里面,比如:datagrid1.Columns.Add(tc1);)。

上面介绍了两种动态邦定模版列的方法,希望可以对初学者有所帮助,其实这里的方法是很简单的,我想这里最关键的问题是如何理解面向对象,希望通过这篇文章的描述初学者可以对面向对象有更好的理解,我们这里使用了接口的继承以及父类子类之间的关系,通过使用接口的继承我们可以制作一个模版列的工厂可以使用同一种模式产生不同的模版列,因为我们使用的是接口(详细信息请见《设计模式》)。

gglqaq 2005-03-15
  • 打赏
  • 举报
回复
还是搞不定
fayewang 2005-03-15
  • 打赏
  • 举报
回复
1.LinkButton有CommandName和CommandArgument这个属性。
2.用ViewState["StrSql"]来动态存储Sql语句,
baobei7758 2005-03-15
  • 打赏
  • 举报
回复

动态创建DataGrid的模版列
http://dev.csdn.net/develop/article/22/22942.shtm

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧