2009-12-08 141 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