2012-06-06 34 views
0

我在標準的Windows窗體上有自定義的TextBox。在TextBox的OnLeave()中,我試圖找出在其構造函數中添加到表單的特定自定義字符串屬性的值;C#確定父窗體上的自定義字符串的值

Form構造函數;

public partial class FormName : Form 
{ 
    public string psTableName { get; set; } 

TextBox OnLeave Method;

protected override void OnLeave(EventArgs e) 
    { 
     try 
     { 
      if (!Convert.ToDouble(this.Text).Equals(this.rnOrigValue)) 
      { 

在上面的if語句中,我試圖找到;

This.FindForm().psTableName 

我試過循環控制;

foreach (Control loObject in this.FindForm().Controls) 
{ 
// Code here 
} 

但是,只能檢索文本框,標籤等。但是,我可以找到psTableName的值?

回答

1

至於建議由德文,這種代碼可以解決你的問題:

(this.FindForm() as FormName).psTablename 

但我認爲,這是不是你真正想要的。實際上,這僅適用於在FormName或FormName中派生的Form中使用自定義TextBox時,因爲this.FindForm() as FormName將在其他任何情況下返回null。這是一個控制的強有力的限制,我會盡量避免它。

舉例來說,你可以(與特別活動也許)一psTableName屬性添加到您的控制,可以由形式傳遞的,但你要小心,以每次更新它的變化形式財產。

否則,你應該以這種方式使用反射:

string s; 
Form parentForm = FindForm(); 
PropertyInfo pi = parentForm.GetType().GetProperty("psTableName"); 
if (pi != null) 
    s = (string)pi.GetValue(parentForm, null); 
+0

感謝弗朗切斯科,這是我所需要的。我嘗試使用(this.FindForm()作爲FormName).psTablename,但它不適用於我。 – ggrewe1959

4

首先,一個字符串是不是控制,因此不會通過FindForm().Controls

因爲它是一個公共成員返回,你就不能這樣做:

(this.FindForm() as FormName).psTablename

我會檢查爲null,首先,但你明白了。

+0

你說得對。很顯然,只有當控件位於FormName的實例中,或者是從它派生的類中時纔有效。 –

2

你可以這樣做是這樣的:

FormName form = this.FindForm() as FormName; 
if (form != null) 
{ 
    string psTableName = form.psTablename; 
} 

然而,這通常是不好的做法。通常,您不希望UserControl假定它的父窗體是特定類型的。最好在控件上創建一個可以由表單設置的公共表名稱屬性。

Controls集合包含表單的所有子控件的列表。除非您的代碼通過調用Controls.Add專門將其添加到該集合中,否則該集合中不會顯示任何內容。通過查看設計器生成的代碼文件,您可以在所有控件中查看代碼。

您提到了窗體的構造函數,但沒有顯示它。

此外,你繼續使用this關鍵字是不必要的,除非你有命名衝突。當沒有命名衝突時,使用this關鍵字是可選的。例如,你可以簡單地說FindForm().ControlsConvert.ToDouble(Text).Equals(rnOrigValue)

+0

嗯。 Devin說得對,OnLeave是一個在OP的自定義TextBox中定義的方法,而不是包含它的Form。順便說一句,如果它是與TextBox的Leave事件關聯的方法,它不會被覆蓋,並且它會在參數中獲得發送者(類似於'private void textBox1_TextChanged(object sender,EventArgs e)')。 –

0

這是否實現您正在尋找的?

protected override void OnLeave(EventArgs e) 
{ 
    string x = this.psTableName; 
} 
+0

Bah! SteveDog擊敗了我。 :) – DWRoelands

+0

但它不會讓你有任何不正確的:) –

+0

我不會那麼確定:-) –