2009-12-08 138 views
3

我正在为一组对象创建一个自定义控件,并且正在跑入一个路障。控制的目的是提供一个简单的方法来实现嵌套,排序等网格。深拷贝ASP.NET GridView

要创建嵌套,我有一个子GridView作为其余子节点的蓝图。我允许开发人员对其进行配置,然后自定义控件创建大量相同的副本。

我的问题在于,我无法完美地复制子网格。 MemberWiseClone()似乎不起作用,并且GridView不可序列化。

我目前的解决方案是在我知道我们需要(ID,的CssClass等)的字段列表手动复制,但是这显然不够,甚至没有触及事件处理器。

是否有深层副本的好方法一个GridView - 或 - 提供我用另一种方法描述的功能?

回答

0

不要忘记我们是面向对象的语言。我认为你需要通过继承BoundField和GridView对象来进行控制。你可以重写GridView的CreateColumns函数,并让它使用新的BoundField对象而不是默认的。

这就是我如何从GridView创建多列TreeView,请参阅here

BoundFiled对象具有可以像New,InitializeDataCell,OnDataBindField,ExtractValuesFromCell或创建自己的事件。您可以添加事件处理程序,如:

Protected Overrides Sub InitializeDataCell(ByVal cell As 
System.Web.UI.WebControls.DataControlFieldCell, 
ByVal rowState As System.Web.UI.WebControls.DataControlRowState) 
    ... ect... 
       AddHandler cell.DataBinding, AddressOf OnDataBindField 

      End Sub 

在GridView继承给你很多,你可以重写,会给你一个什么样的新对象可以做到完全的控制方法。这些包括OnInit,InitializeRow,PerformDataBinding,OnPreRender,OnSorting,UpdateRow,InitializeDataCell等。你可以看到你将如何完全控制。

如果你打算走这条路,我会极力推荐下面的书籍。他在他的例子中使用了GridView。

alt text http://ecx.images-amazon.com/images/I/5182Xwrn3-L._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

+0

这并不完全符合我一直在寻找,但我想我最初的愿望是有点误导。自那以来,我用不同的方法解决了自己的问题,但这是对正确答案的最接近的回应。谢谢。 – beardog 2009-12-10 14:56:41

0

您可以使用视图状态或了ControlState-?一个gridview可以保存到视图状态并从视图状态恢复。如果您可以将控件转换为viewstate字符串,然后将其恢复到新的gridview对象,然后更改对象ID,这可能会为您提供一种机制。你可能想看看IStateFormatter

这不会处理事件处理程序,但。然而,这种方法的好处是,我们知道它适用于保存和恢复其他所有内容。

0

如果你需要的是GridView的另一种设置HTML的快照,那么你可以使用RenderControl方法得到呈现的HTML。

下面是一个例子:

http://forums.asp.net/p/1016960/1368933.aspx

System.IO.StringWriter stringWriter = new System.IO.StringWriter(); 
System.Web.UI.HtmlTextWriter htmlWriter = new System.Web.UI.HtmlTextWriter(stringWriter); 
gridView.RenderControl(htmlWriter); 
string s = stringWriter.ToString(); 

这不能解决问题事件处理程序,但。

1
Protected Sub GridView1_Init(sender As Object, e As System.EventArgs) Handles GridView1.Init 
    Dim ThisGridView As GridView = sender 
    ThisGridView.ApplyStyle(MasterGridView.ControlStyle) 
End Sub 
+0

你可以添加更多的细节? – BitwiseMan 2012-09-26 23:08:09