3

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

为了创建嵌套,我有一个子 GridView 作为其余子级的蓝图。我允许开发人员按照他们想要的方式对其进行配置,然后自定义控件会制作许多相同的副本。

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

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

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

4

4 回答 4

0

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

这就是我从 GridView 创建多列 TreeView 的方式,请参见此处

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。

替代文字

于 2009-12-09T18:11:03.377 回答
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 问题。

于 2009-12-09T16:53:48.633 回答
0

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

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

于 2009-12-09T09:16:25.897 回答
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
于 2012-09-26T21:27:32.317 回答