如何在GRIDVIEW动态添加模板列,且提高可重用性

changechange 2007-11-13 11:17:04
全部源代码如下,大家重点看标有 //★☆ 的两行。
我想提高代码的通用性,直接在 Page_Load 里面传一个控件进去,但是发现每行生成时都是指向同一个控件实例,结果导致GRIDVIEW创建后只有一行。如何能够深层克隆传进去的控件对象呢?





using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Collections;



public class GridViewTemplate : ITemplate
{
private DataControlRowType _templateType;
private Control _control;

/// <summary>
/// 构造函数
/// </summary>
/// <param name="type"></param>
/// <param name="colName"></param>
/// <param name="control"></param>
public GridViewTemplate( DataControlRowType type,
System.Web.UI.Control control)
{
_templateType = type;
_control = control;

}
public void InstantiateIn( System.Web.UI.Control container )
{
switch (_templateType)
{
case DataControlRowType.Header: //原来代码需要判断的,现在由于直接传 WebControl 进来,其实也不用判断了。
container.Controls.Add(_control);
break;
case DataControlRowType.DataRow:
System.Diagnostics.Debug.Print(_control.GetType().ToString());
//Label 等控件无法串列化,因此无法克隆
//byte[] bytes = ReadObject(_control);
//container.Controls.Add((Control)GetObject(bytes));

//★☆
container.Controls.Add(_control); //如果直接写这行,在每次实现 InstantiateIn 的时候永远是添加同一个控件实例的不同引用,无法在页面上显示多个控件(每行一个)

//如果直接在这里用以下代码创建新的Label就没问题
//Label lbl = new Label();
//lbl.ID = "lable1";
//lbl.Text = "dd";
//container.Controls.Add(lbl);

break;
default:
break;
}
}



private Byte[] ReadObject(object obj){
System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
bf.Serialize(ms, obj);
ms.Close();
return ms.ToArray();
}

private object GetObject(Byte[] bytes) {
System.IO.MemoryStream ms = new System.IO.MemoryStream(bytes,0,bytes.Length);
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
return bf.Deserialize(ms);
}



}

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
GridView1.DataSourceID = "";
GridView1.PageSize = 20;

TemplateField customField = new TemplateField();
customField.ShowHeader = true;
Literal lit = new Literal();
lit.Text = "动态添加列1";

Label lbl = new Label();
lbl.ID = "lbl";

HyperLink hyp = new HyperLink();
hyp.ID = "ArticleURL";
hyp.Text = "ddd";
hyp.NavigateUrl = "http://test";

customField.HeaderTemplate = new GridViewTemplate(DataControlRowType.Header,lit);
customField.ItemTemplate = new GridViewTemplate(DataControlRowType.DataRow, lbl); //★☆


GridView1.Columns.Add(customField);
GridView1.DataSource = CreateDataSource(); //SqlDataSource1;
GridView1.DataBind();
}

}

/// <summary>
/// 临时生成一个数据源让GRIDVIEW 绑定
/// </summary>
/// <returns></returns>
private ICollection CreateDataSource()
{
DataTable dt = new DataTable();
DataRow dr;
dt.Columns.Add(new DataColumn("id", typeof(Int32)));
dt.Columns.Add(new DataColumn("text", typeof(string)));
for (int i = 0; i < 6; i++)
{
dr = dt.NewRow();
dr[0] = i;
dr[1] = "列表项目 " + i.ToString();
dt.Rows.Add(dr);
}
DataView dv = new DataView(dt);
return dv;
}


protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
DataRowView gv = (DataRowView)e.Row.DataItem;
Label lbl = (Label)e.Row.FindControl("lbl");
lbl.Text = gv.Row["text"].ToString();

}
}
protected void GridView1_PageIndexChanged(object sender, EventArgs e)
{

}
}
...全文
620 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
changechange 2007-11-16
  • 打赏
  • 举报
回复
继续UP
changechange 2007-11-16
  • 打赏
  • 举报
回复
继续UP
changechange 2007-11-16
  • 打赏
  • 举报
回复
继续UP
swafboxh 2007-11-16
  • 打赏
  • 举报
回复
UP
changechange 2007-11-15
  • 打赏
  • 举报
回复
如果能实现 LABEL DROPDOWNLIST HYPERLINK 等控件的深克隆就好办了,大家哪位知道如何实现?

也就是如何实现 ICloneable 接口和ISerializable接口的问题
sunfishlu 2007-11-14
  • 打赏
  • 举报
回复
DataTable
qq22345111 2007-11-14
  • 打赏
  • 举报
回复
方法:首先将GridView的单元格设计成为可编辑状态!(当有数据输入的时候有回传)
同时,将单元格设定成摸版列!

然后回传编写参数。自动绑定就OK了(数据源需要二次处理)
shoushii 2007-11-14
  • 打赏
  • 举报
回复
没具体做过,个人认为在数据源上做文章比较好。
changechange 2007-11-14
  • 打赏
  • 举报
回复
方法:首先将GridView的单元格设计成为可编辑状态!(当有数据输入的时候有回传)-----------有具体操作方法么?

62,244

社区成员

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

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

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

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