2012-04-13 10 views
1

Ich habe Main.Master, eine innere Masterseite Inner.Master und abc.aspx. In Inner.Master habe ich eine Dropdown-Liste ddlChildren, die ich auf Inner.Master Seite laden bevölkere.In diesem Stadium werden Steuerelemente zur Seite hinzugefügt (.Net) - Referenzieren eines Masterseitensteuerelements

ich mag auf der Lade Seite abc.aspx, erhalte ich Zugriff auf ddlChildren von seiner Master-Seite, Inner.Master:

int x = Int32.Parse(((DropDownList)this.Parent.FindControl("ddlChildren")).SelectedValue); 

ich diese beim Laden der Seite von abc.aspx täte. Das Problem ist, dass diese Kontrolle nicht gefunden wird. Ich denke, dies geschieht becuase die Steuerung noch nicht einmal in Inner.Master geladen wird, weil, wenn ich tun:

this.Parent.Controls.Count 

bei Debugging, ich nur 1 Kontrolle für Inner.Master, die seine Main.Master.

Ich habe dann versucht, ddlChildren onPreRender aufzurufen, aber das gleiche passiert.

Laut http://msdn.microsoft.com/en-us/library/ms178472.aspx werden die Steuerelemente beim Vor-Render geladen, aber das On-Rendering des inneren Masters heißt AFTER abc.aspx. Kann ich das auf einer anderen Seitenebene machen?

Oder bin ich völlig aus der Spur?

+0

können Sie den Inner Master HTML-Code bitte posten? – Pankaj

Antwort

1

Visual breakdown of the lifecycle, including master pages.

OK, ich glaube, es hier mehr los ist.

Zuerst FindControl ist nicht rekursiv, es sei denn, was Sie suchen, ist ein direktes Kind des betreffenden Objekts, Sie werden es nicht finden.

Sie erhalten eine Funktion so etwas wie dieses benötigen (nicht getestet, aber ich habe vor so etwas wie es geschrieben):

private WebControl FindControlRecursive(WebControl parentControl, string controlId) 
{ 
    if(!parentControl.Controls.Any()) 
     return null; 

    var foundControl = parentControl.FindControl(controlId); 

    if(foundControl == null) 
    { 
     foreach(child in parentControl.Controls) 
     { 
      var foundChild = FindControlRecursive(child, controlId); 

      if(foundChild != null) 
       return foundChild;  
     } 
    } 

    return foundControl; 
} 

Zweitens sind Sie Parent Ihrer Seite unter der Annahme, ist der Master-Seite. Dies kann nicht wahr sein. Versuchen Sie Page.MasterPage detailliert here.

also zu dem Schluss, versuchen Sie dies:

var dropDown = (DropDownList)FindControlRecursive(Page.MasterPage, "ddlChildren"); 

Eine weitere Sache. Wenn Sie auf Steuerelemente zugreifen, die sich in einer Ebene oberhalb Ihres aktuellen Seitenbereichs befinden, sollten Sie in Betracht ziehen, das Design zu überdenken.

+0

Können Sie die genaue Ursache erklären? Vielen Dank. – Pankaj

+0

danke mein Freund für Ihre Antwort: so, im Moment bin ich an einem Haltepunkt und dies.Master.Controls.Count hat immer noch 1 Kontrolle:/Lassen Sie mich ein bisschen härter versuchen – test

+0

Das ist genau mein Punkt. 'Master.Controls' hat nur 1 Steuerelement, aber was hat' Master.Controls [0] .Controls'? Möglicherweise müssen Sie einen Drilldown durchführen, um zu finden, wonach Sie suchen. – SouthShoreAK