2010-12-26 46 views
0

私の質問は、default.aspxにあるサーバーコントロール(リストボックス)にアクセスすることです。app_codeクラスからサーバーコントロールにアクセス

Functions.csでこのコントロールにアクセスしたいとします(このクラスはApp_Codeフォルダにあります)。

マイページ構造は次のとおりです。

  • 1マスターページと1コンテンツホルダー
  • Default.aspxを(すべてのコントロールがコンテンツプレースホルダ内にある)
  • Functions.cs(にApp_Codeにあります)

リストボックス要素を埋めるときに、"オブジェクト参照がオブジェクトのインスタンスに設定されていません"というエラーが表示されます。

私はこのコントロールにアクセスしようとしました:(このコードはApp_CodeのFunctions.csにあります)。 これは、基本的に

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); 
    } 
} 

コードdefault.apxファイル

<%@ 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> 

マスターファイル自体だけ1つのプレースホルダを有しているからXMLファイルに配置されているリストボックス内のいくつかの項目を示しています。

それから私は、ネストされたコントロールを検索しません

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

恐ろしいデザインです。 – SLaks

答えて

1

アイテムを挿入するコントロールを関数に渡す必要があります。

Function.cs:

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

分離コード:

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

FindControlファイルDefault.aspx.csに関数のListItem呼びかけます。

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; 
} 

しかし、あなたのデザインがあまりにも連結されています。
これに関係しないデザインを検討する必要があります。

たとえば、パラメーターとしてListBoxを渡したり、メソッドをページクラスに移動したり、ListBoxを取得するための仮想プロパティを持つ基本ページクラスを作成したりすることができます。

関連する問題