我正在为一组同伴创建一个自定义控件,而我正在遇到一个障碍。控件的目的是提供一种使用嵌套,排序等实现网格的简单方法。
为了创建嵌套,我有一个子GridView,作为其余孩子的蓝图。我允许开发人员根据需要配置它,然后自定义控件生成许多相同的副本。
我的问题在于我无法完美复制子网格。 MemberWiseClone()似乎不起作用,并且GridView不可序列化。
我目前的解决方案是手动复制我知道我们需要的字段列表(ID,CssClass等),但这显然是不够的,甚至不会触及EventHandlers。
是否有一种深度复制GridView的好方法 - 或 - 提供我用其他方法描述的功能?
答案 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。
答案 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