2010-01-10 59 views
1

我有一個簡單的用戶控件,其中有一個文本框和標籤。當我以另一種形式使用用戶控件時,我創建了公共屬性來訪問文本框中的文本。Windows窗體應用程序中的用戶控件

我的問題是,當我在窗體中調用它時,屬性返回空值。我錯過了什麼?

我的屬性如下::

public partial class UserControl1 : UserControl 
{ 
     public UserControl1() 
     { 
      InitializeComponent(); 
     } 

     public string rtnTxtMake 
     { 
      get 
      { 
       return txtMake.Text; 
      } 
      set 
      { 
       txtMake.Text = value; 
      } 
     } 
} 

,並在接下來的形式按鈕單擊事件我所說的屬性,如下所示

 UserControl1 Usc = new UserControl1(); 
     string Make = Usc.rtnTxtMake; 

     MessageBox.Show(Make) 
+1

你曾經設置過'txtMake.Text'嗎? – Nifle 2010-01-10 08:29:00

+0

當我運行application.is時,我在文本框中輸入值不夠? – Kishore 2010-01-10 08:32:27

+0

手動當我分配txtMake.Text一些value.i'm能夠得到所需的輸出。但我如何分配在運行時鍵入的值txtMake.Text ???????? – Kishore 2010-01-10 08:38:50

回答

0
UserControl1 Usc = new UserControl1(); 
string Make = Usc.rtnTxtMake; 

如果您的用戶控件具有默認的空文本字段,則似乎是正確的,上述兩行代碼將返回nullString.Empty(通過String.IsNullOrEmpty進行檢查),因爲您明確創建了用戶控件的新實例。

我想你真正想要的是這樣的:

  • 已插入用戶控件到在設計的形式。我們稱這個用戶控件實例爲ctlUser

  • 您有一個帶有Click事件處理程序的按鈕。你問題中的最後幾行代碼來自該處理程序方法。

  • 在處理程序中,您不會創建用戶控件的新實例(Usc),而是指先前插入到表單中的那個實例,即ctlUser。然後事情應該按預期工作。

+0

謝謝..我指的是新實例。 – Kishore 2010-01-10 09:03:31

0

你的用戶控件必須添加到的控件集合父窗體/控件,然後才能正確初始化。通常你不會自己編寫代碼來創建並添加UserControl。

取而代之的是,首先建立你的項目,然後進入主窗體的Deisgner視圖並查看工具箱。

您的UserControl名稱(和一個圖標)應該出現在工具箱的頂部,您可以簡單地將它拖到主窗體中。 Windows窗體設計器將自動爲您生成所需的初始化代碼。

您不應在按鈕單擊事件處理程序中創建控件的新實例。使用設計方法來創建控件,如下所示,你可以簡單地訪問控制的現有實例:

public void button_Click(object sender, EventArgs e) 
{ 
    // myUserControl1 has already been created and initialized by the Deisgner generated code 
    // Note the name 'myUserControl1' is just an example, yours may be different. 
    string controlText=myUserControl1.rtnTxtMake; 

    // Or to change the UserControl textbox value 
    myUserControl1.rtnTxtMake="Testing"; 
} 
+0

@Ash我經常在運行時創建UserControls; imho:並不少見或「異常」的做法。當然你應該指出,任何運行時創建的控件在被添加到某個「容器」之前可能會「無用」。但是,也有例外:我使用運行時創建的3rd。第三方TreeView實例:永遠不會添加到任何容器中:它可以將所選節點保存爲UI TreeView(如果TreeView允許將整個TreeView保存爲XML)。我將UI的TreeView中的選定節點克隆到「ghost」TreeView中,將「ghost」TreeView保存爲XML,然後清除「ghost」。 – BillW 2010-01-10 10:17:38

0

當你說屬性返回一個空值時,你到底意味着什麼?它實際上是否爲空,或者您的MessageBox簡單顯示爲空?

我快速複製了你的代碼,它的行爲和預期的完全一樣 - MessageBox顯示,但它是空的,因爲TextBox控件的Text屬性的默認值是一個空字符串。

此外,你接近這種方式有點不尋常。

首先,該行:

UserControl1 Usc = new UserControl1(); 

你通常不需要實例化一個像這樣的用戶控件。相反,您可以將控件從工具箱拖到窗體的設計圖面上。然後,這將負責爲您實例化並初始化您的控件。

我認爲這實際上是你的問題 - 當你包含上面的代碼行時,你正在創建一個新的用戶控件實例,而且這是無法實現的用戶控件,你已經拖到了設計師。

如果您轉到窗體的設計器視圖並單擊用戶控件,應該會看到屬性窗口。如果您不這樣做,請從視圖菜單中選擇它,或者按F4鍵。在屬性列表中,應該有一個「名稱」,這是爲您的用戶控件生成的編程名稱。如果你願意,你可以在這裏改變它,但是當你在表單的其餘部分引用這個控件時,這是你必須使用的。

其次,接下來的兩行:

string Make = Usc.rtnTxtMake; 

MessageBox.Show(Make) 

您可以直接訪問屬性rtnTxtMake。除非您稍後需要訪問其餘代碼中的Make字符串,否則直接訪問該屬性通常會被認爲是更好的樣式。

MessageBox.Show(userControl.rtnTxtMake); 
+0

@大衛,小小的觀察:因爲變量是在一個(肯定是私人的)按鈕點擊處理程序的範圍中聲明的,所以無法在該範圍之外訪問該變量:無論如何,當然你是正確的,像這樣關閉使用是浪費時間。 – BillW 2010-01-10 09:58:15

相關問題