C#(.net)我要在一个GridView裏的根据数据表来动态生成一个或几个模板列,
模板列裏有三个控件:HyperLink1、Label1、Label2,这三个控件是竖直排列的。有人知道怎麼实现麼?模板列是由後台生成...
模板列裏有三个控件:HyperLink1、Label1、Label2,这三个控件是竖直排列的。
有人知道怎麼实现麼?
模板列是由後台生成 展开
有人知道怎麼实现麼?
模板列是由後台生成 展开
4个回答
展开全部
可以实现,但是我告诉你。动态生成模板列是非常难取到数据的。我试过,就是取不到数据。
这是经过我改造后的样品,自己研究下。
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
/// <summary>
///动态生成Template
/// </summary>
public class MyTemplate:ITemplate
{
private string strColumnName;
private DataControlRowType dcrtColumnType;
public MyTemplate()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
/**//// <summary>
/// 动态添加模版列
/// </summary>
/// <param name="strColumnName">列名</param>
/// <param name="dcrtColumnType">列的类型</param>
public MyTemplate(string strColumnName, DataControlRowType dcrtColumnType)
{
this.strColumnName = strColumnName;
this.dcrtColumnType = dcrtColumnType;
}
static int count1 = 0;
public void InstantiateIn(Control ctlContainer)
{
switch (dcrtColumnType)
{
case DataControlRowType.Header: //列标题
Literal ltr = new Literal();
ltr.Text = strColumnName;
ctlContainer.Controls.Add(ltr);
break;
case DataControlRowType.DataRow: //模版列内容——加载TextBox
TextBox tb = new TextBox();
tb.ID ="TextBox"+count1.ToString();
tb.EnableViewState = true;
tb.Width =35;
ctlContainer.Controls.Add(tb);
//Label lbl = new Label();
//lbl.ID = "Lable" + count1.ToString();
//ctlContainer.Controls.Add(tb);
count1++;
break;
}
}
/// <summary>
/// 绑定生成GridView
/// </summary>
/// <param name="gdv">要绑定的GridView</param>
/// <param name="dtblDataSource">GridView的数据源</param>
/// <param name="strDataKey">GridView的DataKeyNames</param>
public static void GridViewBind(GridView gdv, DataSet dtblDataSource)
{
//gdv.Columns.Clear();
gdv.AutoGenerateColumns = false;
gdv.DataSource = dtblDataSource;
int count=dtblDataSource.Tables[0].Columns.Count;
//gdv.DataKeyNames = new string[]{ strDataKey };
TemplateField[] tfColumn = new TemplateField[count];
for (int i = 0; i <count; i++)
{
tfColumn[i] = new TemplateField();
tfColumn[i].ItemTemplate = new MyTemplate("", DataControlRowType.DataRow);
tfColumn[i].HeaderTemplate = new MyTemplate(dtblDataSource.Tables[0].Columns[i].ToString(), DataControlRowType.Header);
tfColumn[i].EditItemTemplate = new MyTemplate("", DataControlRowType.DataRow);
gdv.Columns.Add(tfColumn[i]);
//if (i==count - 1)
//{
// TemplateField t = new TemplateField();
// t.ItemTemplate = new MyTemplate("", DataControlRowType.DataRow);
// t.HeaderTemplate = new MyTemplate("保存", DataControlRowType.Header);
// gdv.Columns.Add(t);
//}
}
gdv.DataBind();
}
}
这是经过我改造后的样品,自己研究下。
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
/// <summary>
///动态生成Template
/// </summary>
public class MyTemplate:ITemplate
{
private string strColumnName;
private DataControlRowType dcrtColumnType;
public MyTemplate()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
/**//// <summary>
/// 动态添加模版列
/// </summary>
/// <param name="strColumnName">列名</param>
/// <param name="dcrtColumnType">列的类型</param>
public MyTemplate(string strColumnName, DataControlRowType dcrtColumnType)
{
this.strColumnName = strColumnName;
this.dcrtColumnType = dcrtColumnType;
}
static int count1 = 0;
public void InstantiateIn(Control ctlContainer)
{
switch (dcrtColumnType)
{
case DataControlRowType.Header: //列标题
Literal ltr = new Literal();
ltr.Text = strColumnName;
ctlContainer.Controls.Add(ltr);
break;
case DataControlRowType.DataRow: //模版列内容——加载TextBox
TextBox tb = new TextBox();
tb.ID ="TextBox"+count1.ToString();
tb.EnableViewState = true;
tb.Width =35;
ctlContainer.Controls.Add(tb);
//Label lbl = new Label();
//lbl.ID = "Lable" + count1.ToString();
//ctlContainer.Controls.Add(tb);
count1++;
break;
}
}
/// <summary>
/// 绑定生成GridView
/// </summary>
/// <param name="gdv">要绑定的GridView</param>
/// <param name="dtblDataSource">GridView的数据源</param>
/// <param name="strDataKey">GridView的DataKeyNames</param>
public static void GridViewBind(GridView gdv, DataSet dtblDataSource)
{
//gdv.Columns.Clear();
gdv.AutoGenerateColumns = false;
gdv.DataSource = dtblDataSource;
int count=dtblDataSource.Tables[0].Columns.Count;
//gdv.DataKeyNames = new string[]{ strDataKey };
TemplateField[] tfColumn = new TemplateField[count];
for (int i = 0; i <count; i++)
{
tfColumn[i] = new TemplateField();
tfColumn[i].ItemTemplate = new MyTemplate("", DataControlRowType.DataRow);
tfColumn[i].HeaderTemplate = new MyTemplate(dtblDataSource.Tables[0].Columns[i].ToString(), DataControlRowType.Header);
tfColumn[i].EditItemTemplate = new MyTemplate("", DataControlRowType.DataRow);
gdv.Columns.Add(tfColumn[i]);
//if (i==count - 1)
//{
// TemplateField t = new TemplateField();
// t.ItemTemplate = new MyTemplate("", DataControlRowType.DataRow);
// t.HeaderTemplate = new MyTemplate("保存", DataControlRowType.Header);
// gdv.Columns.Add(t);
//}
}
gdv.DataBind();
}
}
展开全部
Gridview 点开它的属性 然后又个ROW 可以在里面设置
追问
模板列是由後臺生成
追答
如果你的意思是后台绑定到前台 这3个控件都不需要用 GRIDVIEW 自身展示的就是LABEL 你的HyperLink 完全可以通过你点击某一行来获取它的e.rowindex 来触发你超文本事件
直接datasoruce =xxxx;然后databind就好
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
祝你好运。这个研究了下,好像有点困难,还在研究中,成功了告诉你。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
每一个控件后面加一个<br/>试试
更多追问追答
追问
模板列是由後臺生成
追答
模板里控件也是后台生成?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询