深层复制ASP.NET GridView

时间:2009-12-08 22:31:30

标签: c# asp.net gridview deep-copy

我正在为一组同伴创建一个自定义控件,而我正在遇到一个障碍。控件的目的是提供一种使用嵌套,排序等实现网格的简单方法。

为了创建嵌套,我有一个子GridView,作为其余孩子的蓝图。我允许开发人员根据需要配置它,然后自定义控件生成许多相同的副本。

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

我目前的解决方案是手动复制我知道我们需要的字段列表(ID,CssClass等),但这显然是不够的,甚至不会触及EventHandlers。

是否有一种深度复制GridView的好方法 - 或 - 提供我用其他方法描述的功能?

4 个答案:

答案 0 :(得分:0)

您可以使用viewstate或controlstate吗? gridview可以保存到viewstate并从viewstate恢复。如果您可以将控件转换为viewstate字符串,然后将其还原为新的gridview对象,然后更改对象ID,这可能会为您提供一种机制。您可能需要查看IStateFormatter

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

答案 1 :(得分: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();

但这并不能解决EventHandler问题。

答案 2 :(得分: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

答案 3 :(得分:0)

    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