2011-06-15 55 views
2

基本上我沒有使用MasterPage,我只是有一個Default.aspx與幾個標籤,文本框等項目。我花了幾個小時尋找解決方案,我找到了一個,但在我的腦海仍然讓我感到困惑,我沒有按照自己想要的方式去做。如何從解決方案中的類訪問ASP.NET頁面上的控件?

我沒有麻煩訪問它們並從PageLoad設置它們的屬性。

但是我做了一個類,就像下面的代碼片段一樣,它會拋出一個「對象引用未設置爲對象的實例」。而我似乎無法弄清楚我缺少的東西。

class Functions 
    { 
     public static void myMethod() 
     { 
      WebForm1 mainForm = new WebForm1(); 
      mainForm.myTextBox.Text = "Something."; 
     } 
    } 

我管理,像這樣的事:

class Functions 
    { 
     public static void myMethod() 
     { 
      System.Web.UI.Page myMainForm; 
      myMainForm = (System.Web.UI.Page)System.Web.HttpContext.Current.Handler; 
      TextBox myTextBox = (TextBox)myMainForm.FindControl("myTextBox"); 
     } 
    } 

但它不是隻是在做它,它是關於學習我的錯我弄不明白了,我希望有一個更簡單這樣做,考慮到我對ASP.NET很新。通常,當我在WinForms中編寫基本應用程序時 - 訪問不同表單時沒有問題。

而我不喜歡爲我試圖訪問的每個控件執行一個FindControl()。如果有一個簡單而有效的解決方法,我很樂意聽到它。

預先感謝您。

編輯:我已經把這個例子放在我的項目的旁邊,但這是我想要完成的想法。代碼片段中可能存在一些小錯誤,請原諒。

+1

你想完成什麼?你這樣做都是錯誤的。 – 2011-06-15 19:05:04

+0

我不明白你要做什麼。 – Amy 2011-06-15 19:06:01

+0

我只是試圖從一個方法中訪問控件,正如我所解釋的。整個項目及其想法較大,但與我所要求的無關。 – Synthel 2011-06-15 19:06:29

回答

4

爲此使用代碼隱藏文件。不要將業務邏輯類與用戶界面緊密結合。

如果使用vb,WebForm1.aspx應該有WebForm1.aspx.cs,如果使用c#或WebForm.aspx.vb,那麼如果您在WebForm1.aspx上有一個TextBox控件,則應該能夠以代碼形式訪問它,隱藏文件(WebForm1.aspx.cs中或WebForm1.aspx.vb)

public class Validate 
{ 
    public bool IsEmail(string email) 
    { 
     //return false if invalid e-mail or true if valid 
    } 
} 

然後在你的WebForm.aspx.cs,你可以叫

Validate validate = new Validate(); 
bool isValidEmail = validate.IsEmail(txtEmail.Text); 

哪裏txtEmail是控制。您可以使Validate類爲靜態,因此您可以這樣做:

bool isvalidEmail = Validate.IsEmail(txtEmail.Text); 
+0

這正是我所要求的,我無法訪問它,那些代碼片段從我的代碼隱藏,這是在Default.aspx.cs 我可以訪問文本框或標籤只有當我寫在「Page_Load 「 部分。如果我在其中創建一個類和一個方法,並且鍵入例如textBox1.Text,它將不會將其識別爲現有的控件。 – Synthel 2011-06-15 19:18:14

+0

@Synthel,你就像其他人說的那樣錯了。分開你的顧慮。將bll或dal類保留在代碼隱藏文件之外。 – Xaisoft 2011-06-15 19:23:22

+0

@Xaisoft因此,將它們作爲單獨項目添加到解決方案中,是您建議的而不是將它們放在Page_Load下面? – Synthel 2011-06-15 19:25:40

1

像這樣傳遞或訪問控件是非常錯誤的。相反,通過方法參數將需要的數據發送給該方法,或者在調用方法之前用必要的數據(例如:control.Text或其他)來初始化函數類。你也在這裏做的是典型的函數式編程,沒有任何OOP代碼。試着找到一本關於面向對象的好書,並先閱讀它,它會讓你的一切變得更加容易。

+0

謝謝你的建議,我會進一步閱讀。但我相信我已經解釋了非常錯誤的東西,所有人都誤解了我。 – Synthel 2011-06-15 19:20:43

2

由asp.net系統處理時,頁面上的控件被創建。它們不會通過調用頁面類的構造函數來創建。這意味着你不能做你最初嘗試的東西 - 非控件將在那裏。第二個版本(FindControl)正常工作是因爲您正在使用由asp.net正確創建的頁面,方法是訪問HttpContext.Current.Handler。

正如其他人指出的,它看起來像你試圖做錯了一些事情。既然你說你是新來的asp.net,也許這裏有人可以提供一些指導,如果你會解釋你需要完成什麼(在功能上,而不是在技術上)

我還應該指出,即使您使用簡單的構造函數調用成功創建頁面,它也會成爲頁面的新實例,而不是您的用戶發佈給您的那個實例。

+0

很高興知道它爲什麼起作用,但學習並不好,我完全錯了我的做法。如果我試圖解釋整個概念,我可能會讓更多人失望。 – Synthel 2011-06-15 19:33:34

2

你應該做的是在設計器或後面的代碼中聲明你的控件。說,myTextBox是你聲明的文本框。如果你想修改該文本框的文本應該創建像這樣

public string MyTextBoxText 
{ 
    get 
    { 
     return MyTextBox.Text; 
    } 
    set 
    { 
     MyTextBox.Text = value; 
    } 
} 

很抱歉的格式屬性,......我一直試圖CTRL + K + d,但它不工作)。

然後您應該訪問屬性並通過屬性操作它們。正如其他人所說的,它會幫助你知道你爲什麼試圖從其他類中修改它,或者你試圖去做什麼。如果你想通過例如主持人來修改文本框,這個屬性將被暴露並且可以被操縱,同時屏蔽你不想被改變的屬性被暴露(如果你暴露整個屬性,情況就不是這樣控制)

+0

謝謝你的提示,我現在就試試,看看它是如何發展的。還要感謝對於初學者不友好的待遇,不像其他人。 – Synthel 2011-06-15 19:24:47

+0

我有一個問題,這是一個很好的做法。我的意思是,如果我試圖取得類似的結果,我應該更願意通過所需的財產,而不是通過整個控制? – Synthel 2011-06-15 19:53:37

+0

是的,除非有特定原因需要整個控件,否則應該只公開需要修改的屬性(通常每個控件只有一個,例如.Text,.Checked等) – 2011-06-15 20:53:33

1

因爲有時你只需要一個答案,需要現在,試試這個:

class Functions 
{ 
    public static void myMethod() 
    { 
     WebForm1 myMainForm; 
     myMainForm = (WebForm1)System.Web.HttpContext.Current.Handler; 
     TextBox myTextBox = myMainForm.myTextBox; 
    } 
} 

訣竅是處理程序轉換爲網頁的類型,而不是到基Page類。這樣做可以在不使用FindControl的情況下強有力地訪問頁面。由於這個Functions類無法訪問頁面上的受保護屬性,因此您還需要使用公共屬性公開他們的數據,正如Mike M.所建議的。

+0

謝謝凱文,我會試試這個,如果我不知道如何正確地做。現在我有點擔心,我在邏輯上做錯了,試圖找出正確的方式來做到這一點,而不是錯誤地學習。 – Synthel 2011-06-15 19:30:29

+0

再次感謝Kevin,你和Mike以及Xisoft一直非常有用,但我不知道如何一次投票給你們所有人。 :) – Synthel 2011-06-15 19:44:56

0

您需要從您的方法中刪除STATIC關鍵字。然後你將能夠直接引用控件。 :)