2012-12-10 108 views
2

我一直在爭取一段時間,我需要一些指導。ASP.NET將控件暴露給其他類

我編碼ASP.NET 4.0 web表單。

的問題是:如何公開一個文本框,標籤或任何其它控制到另一個類。

我有一個WebForm(見下文)。

public partial class WebForm1 : System.Web.UI.Page 
{ 

} 

然後這被引用併發送到另一個類。

public class SearchInitializer 
{ 
    private WebForm1 _webform1; 

    public SearchInitializer(WebForm1 Webform1) 
    { 
     _webform1 = Webform1; 
    } 

    public void ChewSettings() 
    { 

     _webform1 //can't find any control in here?! 
    } 

} 

首先我想到了創建一個公共屬性,我想我可以從我發送到新類的引用訪問..但拿去!

public partial class WebForm1 : System.Web.UI.Page 
{ 
    public string KeywordBox1 
    { 
     get {return txt_keyword.Text;} 
     set {txt_keyword.Text = value;} 
    } 

} 

的我試圖繼承的Webform成其他類。使財產可用,但沒有運氣。

public class SearchInitializer : Webform1 
{ 
    private WebForm1 _webform1; 

    public SearchInitializer(WebForm1 Webform1) 
    { 
     _webform1 = Webform1; 
    } 

    public void ChewSettings() 
    { 

     _webform1 //can't find any control in here?! 
    } 

} 

好的抽象類migth在這裏有用,繼承一切。但我認爲我錯了。我有事件和靜態類,所以他們可以與頁面交談。但我真的不想使用靜態類作爲容器來保存我的控件中的所有信息。所以這些都是我嘗試過的例子,它們都失敗了。所以這是我基本上試圖擴大我知道的;)感謝閱讀! 他們爲什麼失敗了,我該怎麼做?

根據要求進行編輯!

public partial class WebForm1 : System.Web.UI.Page 
{ 

    protected void btn_click(object sender, EventArgs e) 
    { 
     SearchInitializer searchIni = new SearchInitializer(this); 
    } 

} 
+1

你爲什麼想這樣做?我沒有看到任何理由做到這一點... – naveen

+1

你的財產方法是關於正確的,爲什麼_But不會!_?但最有可能的是你在錯誤的時刻稱呼它。添加更多上下文。 –

+1

顯示您如何創建和使用'SearchInitializer' – Igor

回答

5

要暴露控制有兩種方法我能想到的,你可以使用。

您可以從myPage.designer.cs文件中刪除下面的語句,並將其放置在後面的代碼作爲公共聲明:

protected global::System.Web.UI.WebControls.TextBox myTextBox; 

成爲

public System.Web.UI.WebControls.TextBox myTextBox; 

這應該使它立即訪問。我的首選方法是爲每個想要提供訪問權限的特定控件添加一個屬性。

public System.Web.UI.WebControls.TextBox MyTextBoxElement 
{ 
    get 
    { 
     return myTextBox; 
    } 
} 

這允許提供補充訪問控制,如果您需要它們或其他條件。在任何情況下,要訪問字段或屬性,消費對象必須通過您的特定頁面類型來引用它。

+0

你能解釋一下:「在你的示例中,下面的代碼失敗是因爲'this'屬於類型'System.Web.UI.Page'而不是'WebForm1'類型。當然這總是當前對象的類型,即'Webform1' ... – Chris

+1

@Chris:Nope。當然不能。我可以給你幾個理由,爲什麼我的大腦會想到這一點,但沒有任何合理的:) –

2

不知道你正在嘗試做的,但你需要使用base關鍵字繼承CALSS內訪問base類,不是有聲明的實例。

public partial class WebForm1 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    public string KeywordBox1 
    { 
     get { return txt_keyword.Text; } 
     set { txt_keyword.Text = value; } 
    } 
} 

public class SearchInitializer : WebForm1 
{ 
    public SearchInitializer() 
    { 
    } 

    public void ChewSettings() 
    { 
     // Works 
     base.KeywordBox1 = "Red"; 
    } 
} 

如果intellisense未顯示該屬性,請嘗試重新構建解決方案。然後它會刷新可用屬性的列表,並顯示它。

+0

我試過財產仍然不顯示在智能感知。但是,謝謝..;) – 8bitcat

+1

@CarlPalsson見更新。如果基類是公共的,那麼它們的屬性總是可用的。您的智能感知可能不會按預期進行重建。嘗試重建解決方案。 – Kami

2

您的原始方法必須工作。我建議你用一個帶有文本框和SearchInitializer類的表單創建一個小型測試項目,然後看看它是否有效,然後找出當前項目中的不同之處。