2012-11-05 80 views
3

如果超類具有將Label更改爲「Hello World」的函數A()。我怎麼能得到一個子類調用A()具有相同的結果?截至目前,我沒有收到編譯錯誤,但文本不會改變!調用改變組件(標籤)的超類功能

示例代碼:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent();    
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     FunctionA("Hello"); 
    } 

    public void FunctionA(string s) 
    { 
     label1.Text = s; 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     Test t = new Test(); 
    } 
} 

class Test : Form1 
{ 
    public Test() 
    { 
     FunctionA("World"); 
    } 
} 
+0

Button2_Click正在創建一個新的表單實例。您是否希望更改與button2相同表單實例中的標籤? –

+0

是的,我意識到:/是的。我想讓子類觸發超類的函數A –

+0

基類應該永遠不知道它的子類。你究竟想要完成什麼?這聽起來像你試圖實現訪問者模式 –

回答

0

兩者Forms必須具有他們自己的控制Label顯示消息。您可能正在使用一個Label來顯示不屬於顯示Form的消息。

我不知道什麼是要努力實現,但你爲什麼不只是傳遞Label控制泛函修改的消息是這樣的:

public void FunctionA(ref Label lbl, string s) 
{ 
    lbl.Text = s; 
} 

新增:你可以做到這方式:

  1. 首先創建FormA的實例。

    static void Main() 
    { 
        //... 
        FormA frmA = new FormA(); 
        Application.Run(frmA); 
    } 
    
  2. 通過從FormB內暴露於任何FormA操縱參數的構造傳遞的FormA的實例FormB

    FormB frmB = new FormB(frmA); 
    
    //... 
    
    public partial class FormB : Form 
    { 
        public FormB() 
        { 
         InitializeComponent(); 
        } 
    
        //parameterized constructor 
        public FormB(FormA obj) 
        { 
         FormA = obj; 
         InitializeComponent(); 
        } 
    
        public FormA FormA { get; set; } 
    } 
    
+0

嗯,可能是..但我想更改標籤的超類..從另一個類(最好是一個子類?)。我如何實現這一目標? –

+1

爲什麼參考?按價值傳遞將獲得相同的結果。這將允許重新分配標籤,而不僅僅是文本。我會強烈避免通過ref傳遞任何東西。 –

+0

啊,很好!謝謝!但。這適用於標籤。但讓我們說FunctionA是一個更復雜..並從SQL獲取數據並添加到TreeView。那麼,我將如何調用FunctionA,而不會收到空引用錯誤? –

0

運行的主要形式之前實例化形式。將form1引用分配給表單2

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Form1 mainForm = new Form1(); 
     new Form2() { Form1 = mainForm }.Show(); 
     Application.Run(mainForm); 
    } 
} 

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    public Form1 Form1 { get; set; } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     this.Form1.Update("World"); 
    } 
} 

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     this.Update("Hello"); 
    } 

    public void Update(string text) 
    { 
     this.label1.Text = text; 
    } 
} 
+0

不錯!:)謝謝 –