2012-03-29 11 views
0

Ich versuche, das MainContentBlock-Steuerelement von der ASPX zugreifen, aber nicht dazu in der Lage.Wie Zugriff auf Steuerelement von übergeordneten Aspx von seinem untergeordneten Ascx

In der aspx-Datei ich beide Kontrollen registriert haben:

<uc3:ContentBlock ID="MainContentBlock" runat="server" DynamicParameter="id" DefaultContentID="3951" /></uc3> 

<uc3:childshow ID="Childshow" runat="server"/></uc3> 

hinter Im Code für child.ascx

If Me.Parent.Page.FindControl("MainContentBlock") IsNot Nothing AndAlso Me.MainContentBlock.Item.Id = 4357 Then 

...

Aber der Fehler sagt BC30456: ' MainContentBlock 'ist kein Mitglied von' Kind '.

Es ist fast wie der ".parent" Teil hat nicht funktioniert.

jedoch Wenn ich versuche, die folgenden:

If Me.Parent.MainContentBlock IsNot Nothing AndAlso Me.MainContentBlock.Item.Id = 4357 Then 

...

Es wird den Fehler bringen „BC30456: 'MainContentBlock' ist kein Mitglied von‚System.Web.UI. Control‘.

und so scheint es zumindest den .parent Teil wieder erkannt.

verwirrt ... bitte helfen, danke.

Antwort

1

Dies liegt daran, dass Sie versuchen, MainContentBlock als Eigenschaft des untergeordneten Steuerelements zu referenzieren. Wenn Sie Me.MainContentBlock verwenden, bezieht sich Me auf das untergeordnete Steuerelement.

Sie nur Findcontrol verwenden müssen, und richtig die gefundene Kontrolle Referenz:

Dim myBlock As ContentBlock = TryCast(Me.Parent.FindControl("MainContentBlock"), ContentBlock) 

If myBlock IsNot Nothing Then 
    'do things with myBlock 
End If 
+0

Hallo, aber ich habe hinzugefügt .Parent.FindControl()? Ich dachte, das würde auf die Eltern-aspx-Datei zugreifen? Es tut uns leid, immer noch verwirrt ... – eastboundr

+0

FindControl möglicherweise das Steuerelement finden, aber das ändert nicht die Referenz oder versuchte Verweis auf Me.MainContentBlock. –

+0

Danke ich denke ich sehe wo das Problem liegt ... – eastboundr

0

Je nachdem, wo die Steuerung auf der Seite befindet, müssen Sie kann es rekursiv finden, aber in einer einfachen Situation, die Sie würde dies nur tun:

var pnl = Page.FindControl("MainContentBlock") as Panel; //or whatever it is 
if (pnl != null) 
{ 
    //your code here 
} 

Hier ist eine rekursive Methode, wenn Sie es brauchen:

public Control FindControlRecursive(string controlID, Control parentCtrl) 
{ 
    foreach (Control ctrl in parentCtrl.Controls) 
    { 
     if (ctrl.ID == controlID) 
      return ctrl; 
     FindControlRecursive(controlID, ctrl); 
    } 
    return null; 
} 

Und Sie würden es so nennen:

var pnl ((PageName)Page).FindControlRecursive("MainContentBlock") as Panel; 
+0

Hallo James, Danke, ich denke, ich schaffe es dem Kind, die Kontrolle in aspx zu finden.Ich möchte jedoch auch auf die Eigenschaft dieses Benutzersteuerelements zugreifen, beispielsweise: Wenn Me.Parent.FindControl ("MainContentBlock"). EkItem IsNot Nothing Then .... Wo EkItem ist eine Eigenschaft des Steuerelements. Ich konnte zu diesem Zeitpunkt nicht auf EkItem zugreifen, da es den Fehler gibt: BC30456: 'EkItem' ist kein Mitglied von 'System.Web.UI.Control'. Alles, was ich falsch gemacht habe? Vielen Dank. – eastboundr

+0

eigentlich habe ich es zur Arbeit gebracht. Vielen Dank! – eastboundr

0

FindControl funktionieren, aber der Schmerz ist, dass für das, was Sie suchen höher dann nur bei übergeordneter Ebene sein kann. Hier ist eine handliche Methode, die ich verwende:

public static Control FindControlRecursive(Control root, string id) 
{ 
    if (root.ID == id) 
     return root; 

    foreach (Control ctl in root.Controls) 
    { 
     Control foundCtl = FindControlRecursive(ctl, id); 

     if (foundCtl != null) 
      return foundCtl; 

    } 
    return null; 
} 
+0

Danke, ich glaube, ich habe die Kontrolle gefunden. Aber weißt du, wie ich auch auf sein Eigentum zugreifen könnte? Zum Beispiel: Me.Parent.FindControl ("MainContentBlock"). EkItem Wo EkItem eine Eigenschaft des Benutzers Control ist. Die obige Zeile gibt mir einen Fehler: BC30456: 'EkItem' ist kein Mitglied von 'System.Web.UI.Control'. Irgendwelche Ideen? Danke – eastboundr

+0

Arbeiten jetzt, danke – eastboundr

+0

Um vorherigen Kommentar zu beantworten: Typ Casting –