asp.net FindControl Recursively

前端 未结 2 858
礼貌的吻别
礼貌的吻别 2020-12-21 05:40

This is a really weird one - I will do my best to explain.

I have a basic master page:

<%@ Master Language=\"VB\" CodeFile=\"MasterPage.master.vb\         


        
2条回答
  •  离开以前
    2020-12-21 06:12

    Why don't you simply expose properties that return PH1 and PH2, because the master has the reference of them and you don't need to iterate all child controls of master:

    Public ReadOnly Property Container1 As PlaceHolder
        Get
            Return Me.PH1
        End Get
    End Property
    
    Public ReadOnly Property Container2 As PlaceHolder
        Get
            Return Me.PH2
        End Get
    End Property
    

    You can access them:

    Dim ph1 As PlaceHolder = DirectCast(Me.Master, myMaster).Container1
    Dim ph2 As PlaceHolder = DirectCast(Me.Master, myMaster).Container2
    

    Another problem is this line:

    controlInstance1.ID = "control_2"
    

    You are setting only controlInstance1's ID twice, but that doesn't cause your issue.

    Your main problem is that you are adding the controls to the placeholders in Page_Init instead of Page_Load. Therefore the UserControls can't load their ViewState and the ListView is empty. Recreate them in Page_Load and it will work.

    Edit: But i must admit that i don't know why your iterate extension wins over the recursive. The reference on the placeholders are the same, they shouldn't work both, weird.

    summary:

    • it works with my properties,
    • putting all in page's load event handler instead init
    • with your iterate-extension(for whatever reasons)

    It also works if you add both UserControls at last, after you've found the placeholders via FindControlRecursively.

    zone.Controls.Add(controlInstance1)
    zone2.Controls.Add(controlInstance2)
    

    I'm losing motivation on this, but i'm sure you'll find the answer here. Controls.Add loads it's parent's ViewState into all childs and therefore it depends on when you add the controls, also the index of the controls in their parent controls must be the same on postback to reload the ViewState.

    Your recursive extension method touches control1's ID after you've added it to PH1(while searching PH2), the iterative extension does not. I assume that this corrupts it's ViewState in Page_Init.

    Conclusion Use properties instead

提交回复
热议问题