如何动态的添加 DataGrid 的模板列 (100) rt....日死小日本 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 html页面的DataGrid如下所示: <asp:datagrid id="grdTest" runat="server" Height="228px" Width="262px" AutoGenerateColumns="False" AllowPaging="True"> <Columns> <asp:TemplateColumn> <ItemTemplate> <!-- 这里是关键--> <SPAN> <%# Container.ItemIndex+1 %></SPAN> </ItemTemplate> </asp:TemplateColumn> <asp:BoundColumn DataField="CategoryName"></asp:BoundColumn> <asp:BoundColumn DataField="Description"></asp:BoundColumn> </Columns> </asp:datagrid> 后台代码 private void Page_Load(object sender, System.EventArgs e) { // 在此处放置用户代码以初始化页面 strConnection = ConfigurationSettings.AppSettings["sa"].ToString(); myConnection = new SqlConnection(strConnection); SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT CategoryName, Description FROM Categories",myConnection); // 为了分页方便ds是一个全局的变量 myAdapter.Fill(ds); this.grdTest.DataSource = ds.Tables[0].DefaultView; this.grdTest.DataBind(); } 从上面的过程可以看出我们使用的是表Categories,这样我们就可以产生一列自增长的列,此列是从1开始的。如果我们想要一个从0开始的列有该怎么办呢?我们可以把<!-- 这里是关键-->下面的<span>里面的东西换成<asp:Label id=lblRowNumber runat="server" Text='<%# DataBinder.Eval(Container, "ItemIndex", "{0}") %>'>就可以了。 如果我们想要实现分页也显示的方法我们将使用DataTable的方法来实现,首先我们将DataGrid的列全部变成绑定列(为了方便演示,不是必须)。如下所示: <asp:table id="tbData" runat="server" BackColor="LightSteelBlue" Height="13px" Width="16px" Font-Names="宋体" Font-Name="宋体" Font-Size="8pt" CellPadding="1" CellSpacing="0" BorderColor="black" BorderWidth="1" Gridlines="Both"></asp:table><br/> <asp:datagrid id="grdTest" runat="server" Height="228px" Width="262px" AutoGenerateColumns="False" PageSize="2" AllowPaging="True"> <Columns> <asp:BoundColumn DataField="RowNumber" HeaderText="RowNumber"></asp:BoundColumn> <asp:BoundColumn DataField="CategoryName"></asp:BoundColumn> <asp:BoundColumn DataField="Description"></asp:BoundColumn> </Columns> </asp:datagrid> 在后台我们添加一个函数: private DataTable GetRowNumberTable(DataTable dt){ DataColumn col = new DataColumn("RowNumber",Type.GetType("System.Int32")); dt.Columns.Add(col); for(int i = 0;i<=dt.Rows.Count-1;i++){ if(0 == i) dt.Rows[i][col] = 1; else dt.Rows[i][col] = Convert.ToInt32(dt.Rows[i-1][col]) +1; } return dt; } 然后我们将原来数据源改成如下: this.grdTest.DataSource = this.GetRowNumberTable(ds.Tables[0]).DefaultView; 这样一来即使分页,数字也是连续的,并且将编号应用于所有的行而不是当前这一页的行。 在 DataGrid 控件中以编程方式创建模板http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vbcon/html/vbtskcreatingtemplatesprogrammaticallyindatagridcontrol.asp动态创建DataGrid的模版列 选择自 cuike519 的 Bloghttp://dev.csdn.net/develop/article/22/22942.shtm有的时候我们需要邦定很复杂的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);)。 上面介绍了两种动态邦定模版列的方法,希望可以对初学者有所帮助,其实这里的方法是很简单的,我想这里最关键的问题是如何理解面向对象,希望通过这篇文章的描述初学者可以对面向对象有更好的理解,我们这里使用了接口的继承以及父类子类之间的关系,通过使用接口的继承我们可以制作一个模版列的工厂可以使用同一种模式产生不同的模版列,因为我们使用的是接口(详细信息请见《设计模式》)。 xwqjamky(陌上烟花) 是不是回帖位置不对呀方法是添加了一个序号列吧!在DataGrid_ItemDataBound(){ e.Item.Cell[0].Text=(DataGrid.CurrentPageIndex*DataGrid.PageSize+DataGrid.Items.Count+1).ToString();} 动态创建DataGrid的模版列:http://dev.csdn.net/develop/article/22/22942.shtm sqlDataSource无法自动生成插入、更新语句 excel文件只能保存在默认debug路径 pdfsharp如何在页眉页脚上加一条横线 获取treeview的第一个节点的最后节点值 劫取自符串并得到值 在线等~~~~~~~ PayPal 支付接口 自定义控件继承datalist的问题 关于排序法无限分类的树状绑定代码,看看错在哪里? 请问怎么实现treeview里面选择节点后其他未选节点自动合并? 一个dataset的问题,急!!! 十一每天登陆居然没有给我加可用分~谁能给我一段水晶报表显示DATASET的代码? DataView的FindRows,或RowFilter怎样填入两个条件
<asp:datagrid id="grdTest" runat="server" Height="228px" Width="262px" AutoGenerateColumns="False" AllowPaging="True">
<Columns>
<asp:TemplateColumn>
<ItemTemplate>
<!-- 这里是关键-->
<SPAN>
<%# Container.ItemIndex+1 %></SPAN>
</ItemTemplate>
</asp:TemplateColumn>
<asp:BoundColumn DataField="CategoryName"></asp:BoundColumn>
<asp:BoundColumn DataField="Description"></asp:BoundColumn>
</Columns>
</asp:datagrid>
后台代码
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
strConnection = ConfigurationSettings.AppSettings["sa"].ToString();
myConnection = new SqlConnection(strConnection);
SqlDataAdapter myAdapter = new SqlDataAdapter("SELECT CategoryName, Description FROM Categories",myConnection);
// 为了分页方便ds是一个全局的变量
myAdapter.Fill(ds);
this.grdTest.DataSource = ds.Tables[0].DefaultView;
this.grdTest.DataBind();
} 从上面的过程可以看出我们使用的是表Categories,这样我们就可以产生一列自增长的列,此列是从1开始的。如果我们想要一个从0开始的列有该怎么办呢?我们可以把<!-- 这里是关键-->下面的<span>里面的东西换成<asp:Label id=lblRowNumber runat="server" Text='<%# DataBinder.Eval(Container, "ItemIndex", "{0}") %>'>就可以了。 如果我们想要实现分页也显示的方法我们将使用DataTable的方法来实现,首先我们将DataGrid的列全部变成绑定列(为了方便演示,不是必须)。如下所示:
<asp:table id="tbData" runat="server" BackColor="LightSteelBlue" Height="13px" Width="16px" Font-Names="宋体" Font-Name="宋体" Font-Size="8pt" CellPadding="1" CellSpacing="0" BorderColor="black" BorderWidth="1" Gridlines="Both"></asp:table><br/>
<asp:datagrid id="grdTest" runat="server" Height="228px" Width="262px" AutoGenerateColumns="False" PageSize="2" AllowPaging="True">
<Columns>
<asp:BoundColumn DataField="RowNumber" HeaderText="RowNumber"></asp:BoundColumn>
<asp:BoundColumn DataField="CategoryName"></asp:BoundColumn>
<asp:BoundColumn DataField="Description"></asp:BoundColumn>
</Columns>
</asp:datagrid>
在后台我们添加一个函数:
private DataTable GetRowNumberTable(DataTable dt){
DataColumn col = new DataColumn("RowNumber",Type.GetType("System.Int32"));
dt.Columns.Add(col);
for(int i = 0;i<=dt.Rows.Count-1;i++){
if(0 == i)
dt.Rows[i][col] = 1;
else
dt.Rows[i][col] = Convert.ToInt32(dt.Rows[i-1][col]) +1;
}
return dt;
}
然后我们将原来数据源改成如下:
this.grdTest.DataSource = this.GetRowNumberTable(ds.Tables[0]).DefaultView;
这样一来即使分页,数字也是连续的,并且将编号应用于所有的行而不是当前这一页的行。
http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/vbcon/html/vbtskcreatingtemplatesprogrammaticallyindatagridcontrol.asp动态创建DataGrid的模版列 选择自 cuike519 的 Blog
http://dev.csdn.net/develop/article/22/22942.shtm有的时候我们需要邦定很复杂的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);)。 上面介绍了两种动态邦定模版列的方法,希望可以对初学者有所帮助,其实这里的方法是很简单的,我想这里最关键的问题是如何理解面向对象,希望通过这篇文章的描述初学者可以对面向对象有更好的理解,我们这里使用了接口的继承以及父类子类之间的关系,通过使用接口的继承我们可以制作一个模版列的工厂可以使用同一种模式产生不同的模版列,因为我们使用的是接口(详细信息请见《设计模式》)。
方法是添加了一个序号列吧!
在DataGrid_ItemDataBound()
{
e.Item.Cell[0].Text=(DataGrid.CurrentPageIndex*DataGrid.PageSize+DataGrid.Items.Count+1).ToString();
}
http://dev.csdn.net/develop/article/22/22942.shtm