Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 深度复制ASP.NET GridView_C#_Asp.net_Gridview_Deep Copy - Fatal编程技术网

C# 深度复制ASP.NET GridView

C# 深度复制ASP.NET GridView,c#,asp.net,gridview,deep-copy,C#,Asp.net,Gridview,Deep Copy,我正在为一群同龄人创建一个自定义控件,但我遇到了一个障碍。控件的目的是提供一种简单的方法来实现嵌套、排序等网格 为了创建嵌套,我有一个子GridView,它可以作为其余子对象的蓝图。我允许开发人员根据自己的需要对其进行配置,然后自定义控件生成许多相同的副本 我的问题是我不能完全复制子网格。MemberWiseClone()似乎无法工作,GridView无法序列化 我目前的解决方案是手动复制我知道我们需要的字段列表(ID、CssClass等),但这显然不够,甚至不涉及EventHandler 有没

我正在为一群同龄人创建一个自定义控件,但我遇到了一个障碍。控件的目的是提供一种简单的方法来实现嵌套、排序等网格

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

我的问题是我不能完全复制子网格。MemberWiseClone()似乎无法工作,GridView无法序列化

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


有没有一种好方法可以深度复制GridView,或者使用另一种方法提供我描述的功能?

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


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

如果您只需要在另一个设置中创建GridView html的快照,那么您可以使用
RenderControl
方法获取呈现的html

下面是一个例子:


不过,这并不能解决EventHandler问题。

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

这就是我如何从GridView创建多列树视图的方法,请参见

BoundField对象具有您可以覆盖的事件,如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


这不是我想要的,但我认为我最初的愿望有点被误导了。此后,我用不同的方法解决了自己的问题,但这是最接近正确的回答。谢谢。你能再补充一点细节吗?
 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
    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