2009-05-17 5 views
2

Guten Tag, ich brauche, um dynamisch Felder in einer Seite nach dem Dienst zu aktivieren, die ausgeführt werden soll ...Wie man dynamisch erhält alle Kontrollen (und es ist IDs) in einer aspx Seite?

Lassen Sie mich erklären:

Es gibt eine Seite mit allen möglichen Bereichen und eine ListBox mit alle ausgewählten Dienste ausgeführt werden, dann, wenn der Benutzer auswählt, welcher Dienst ausgeführt werden soll (eine Autoplatte, beispielsweise aus), dann muss ich nur das Feld (n) aktivieren, dass der Dienst erfordern ... (die realationship zwischen Dienstleistungen und Felder werden in einer Datenbank gespeichert).

public void CheckAll(int pService_Id, Control pPage) 
{ 

    foreach (Control control in pPage.Controls) 
    { 
     busExecutaServico vExecuta = new busExecutaServico(); 

     if (vExecuta.EnableField(control.ID.ToString(), Convert.ToInt32(listBoxServices.SelectedValue))) 
     { 
      switch (control.GetType().ToString()) 
      { 
       case "TextBox": 
        TextBox controleText = (TextBox)Page.FindControl(control.ID.ToString()); 
        controleText.Enabled = true; 
        break; 

Beachten Sie, dass busExecutaServico die Klasse, die das Verfahren (EnableField) enthält zum Prüfen, ob das ausgewählte Element ein beliebiges Feld auf der Datenbank übereinstimmt ..

Ich kann die control.ID scheinen zu bekommen. ToString(), um richtig zu funktionieren (die ID kommt immer als NULL)

Wenn jemand mir helfen kann, dies zu lösen, oder wenn es einen anderen Weg gibt (auch wenn es völlig anders ist als das, was ich versuche), wäre es großartig Hilfe. danke

Antwort

1

Beachten Sie, dass FindControl nur den aktuellen Benennungscontainer durchsucht, damit Page.FindControl nur Steuerelemente findet, die direkt zu Seite hinzugefügt werden. wenn Sie einen Repeater Kontrolle hatte zum Beispiel, dass die Kontrollen hatten Sie suchen und es wurde zu Seite hinzugefügt, könnten Sie Ihre Repeater-Steuerung über Page.FindControl finden, aber es würde nicht untergeordneten Steuerelemente in Ihrem Repeater finden, dann würden Sie haben um das FindControl für alle Containersteuerelemente auf der Seite rekursiv auszuführen.

Das mag etwas komisch erscheinen, aber es erlaubt Ihnen, Steuerelemente mit derselben ID auf derselben Seite zu haben. Wenn Sie beispielsweise 10 Instanzen eines Benutzersteuerelements mit darin enthaltenen Textfeldern namens "MeinName" haben, möchten Sie wirklich, dass sie nicht gegenseitig die Felder "MeinName" überschreiben!

+0

Nun, die Kontrollen sind bereits in der Seite ... ich in einer Datenbank gespeichert haben sie nur Namen ist .. so kann ich überprüfen, ob die control.ID die ID übereinstimmt gespeichert in der Datenbank –

0

In Ihrem Code Sie keine Kontrolle suchen müssen - Sie haben es bereits in ‚Kontrolle‘ Variable. Sie brauchen auch nicht zu TextBox zu werfen, nur um zu einem WebControl, nur dies tun:

... 
if (vExecuta.EnableField(control.ID.ToString(), Convert.ToInt32(listBoxServices.SelectedValue))) 
    ((WebControl)control).Enabled = true; 

P. S. control.ID ist bereits eine Zeichenfolge, daher sollten Sie auch ID.ToString() entfernen.

1

Ihr Code wird auf eine Null für eine ID stoßen, es sei denn, jede Kontrolle hat eine ID erhalten.

Auch warum Verwendung: -

TextBox controleText = (TextBox)Page.FindControl(control.ID.ToString()); 

überhaupt statt: -

TextBox controleText = (TextBox)control; 

und in der Tat, da Sie nur die Enabled-Eigenschaft ändern berücksichtigen: -

((WebControl)control).Enabled = False; 

Das, so vermute ich, wird viele Fallaussagen beseitigen.

3

Ich verwende gerne eine rekursive Funktion für die Ortung von Steuerelementen nach Typ oder ID.

public Control FindControlRecursive(Control rootControl, string controlId) 
{ 
    if (rootControl.ID == controlId) 
     return rootControl; 

    foreach (Control control in rootControl.Controls) 
    { 
     Control foundControl = FindControlRecursive(control, controlId); 
     if (foundControl != null) 
     { 
      return foundControl; 
     } 
    } 

    return null; 
} 

public Control FindControlRecursive(Control rootControl, Type type) 
{ 
    if (rootControl.GetType().Equals(type)) 
     return rootControl; 

    foreach (Control control in rootControl.Controls) 
    { 
     Control foundControl = FindControlRecursive(control, type); 
     if (foundControl != null) 
     { 
      return foundControl; 
     } 
    } 

    return null; 
} 

Sie können diese anpassen, um zuerst eine Sammlung von Steuerelementen zurückzugeben und sie später zu verarbeiten.Es könnte einfacher sein, den Überblick zu behalten, was passiert.

ich diese Technik hier gelernt: http://www.west-wind.com/Weblog/posts/5127.aspx

Verwandte Themen