2010-12-26 30 views
0

Meine Frage bezieht sich auf den Zugriff auf ein Serversteuerelement (Listbox), das sich in default.aspx befindet.Zugreifen auf das Serversteuerelement aus der app_code-Klasse

Ich möchte auf dieses Steuerelement in Functions.cs zugreifen (diese Klasse befindet sich im Ordner App_Code).

Meine Seite Struktur:

  • 1 MasterpaDE mit 1 Inhalt Halter
  • Default.aspx (alle Bedienelemente befinden sich innerhalb des Inhalts Platzhalter)
  • Functions.cs (befindet sich in App_Code)

Jetzt, wenn ich versuche, die Listbox Elemente ich den Fehler erhalten zu füllen „Objektverweis nicht auf eine Instanz eines Objekts festgelegt.“

Was ich versucht habe, Zugriff auf dieses Steuerelement zu erhalten: (Dieser Code befindet sich in Functions.cs in App_Code). Dies zeigt grundsätzlich einige Elemente in der Listbox, die

private static string file = HttpContext.Current.Server.MapPath("~/App_Data/Questions.xml"); 

public static void ListItems() 
{ 
    XmlDocument XMLDoc = new XmlDocument(); 
    XMLDoc.Load(file); 
    XPathNavigator nav = XMLDoc.CreateNavigator(); 

    XPathExpression expr; 
    expr = nav.Compile("/root/file/naam"); 
    XPathNodeIterator iterator = nav.Select(expr); 

    //ATTEMPT to get access to ServerControl(listbox) 
    Page page = (Page)HttpContext.Current.Handler; 
    ListBox test = (ListBox)page.FindControl("lbTest"); //control is called lbTest in Default.aspx 

    test.Items.Clear(); 

    while (iterator.MoveNext()) 
    { 
     test.Items.Add(iterator.Current.Value); 
    } 
} 

-Code aus der default.apx Datei

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterFile.master" AutoEventWireup="true" CodeFile="default.aspx.cs" Inherits="default" Debug="true" %> 

<%@ MasterType TypeName="Master" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="cphContent" Runat="Server" > 

    <asp:MultiView ID="mvTest" runat="server" > 

     <asp:View ID="vCollection" runat="server"> 
      <asp:ListBox ID="lbTest" runat="server" CssClass="listbox" ></asp:ListBox> 
     </asp:View> 


    </asp:MultiView> 

</asp:Content> 

Das Masterfile in einer XML-Datei befinden sich hat nur 1 Platzhalter.

Dann rufe ich die Funktion Listitem in dem Default.aspx.cs

protected void Page_Load(object sender, EventArgs e) 
{  
    Functions.ListItems(); 
} 
+1

, dass eine schreckliche Design ist. – SLaks

Antwort

1

Sie sollten das Steuerelement übergeben, das Sie mit Elementen in Ihre Funktion einfügen möchten.

Function.cs:

public static void ListItems(ListBox test) 
{ 
    //same as what you had before, minus the 
    //ATTEMPT to get access to ServerControl(listbox) 
    //lines 
} 

Codebehind:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Functions.ListItems(lbTest); //pass your control in here... 
} 
2

FindControl nicht verschachtelt Kontrollen suchen Datei.

You need to search recursively:

private Control FindControlRecursive(Control rootControl, string controlID) { 
    if (rootControl.ID == controlID) return rootControl; 

    foreach (Control child in rootControl.Controls) { 
     var match = FindControlRecursive(child, controlID); 
     if (match != null) return match; 
    } 
    return null; 
} 

Allerdings ist Ihr Design viel zu gekoppelt.
Sie sollten ein Design berücksichtigen, das dies nicht beinhaltet.

Beispielsweise können Sie die ListBox als Parameter übergeben, die Methode an die Seitenklasse verschieben oder eine Basis-Page-Klasse mit einer virtuellen Eigenschaft erstellen, um die ListBox zu erhalten.

Verwandte Themen