2011-11-16 64 views
1

我有一個主窗口窗體和另一個從窗體繼承的窗體。如何使基本窗體控件在子窗體中不可見C#

第二種形式需要訪問主窗體的控件(按鈕,圖片框等)。 由於它從主窗體繼承,子窗體的默認外觀與主窗體的默認外觀相同。

我該如何克服這一點,並同時訪問主窗體的控件?

我不想被迫改變我的設計!

問題已經解決,日Thnx的答案...

+0

恩,不太清楚。你有'Form1'來打開'Form2',它被定義爲'Form2:Form1'?現在你想讓Form2的默認外觀與Form1的默認外觀不同? – sq33G

+0

@ sq33G是的,正好...... –

回答

1

當我繼承的主要形式的其它形式的inhereited一個的外觀變得酷似主要形式。

我該如何克服這一點,並同時訪問主窗體的控件。

那麼,根本不要繼承它。你是如何以及爲什麼繼承它的?你想要訪問什麼?

如果Form2你有下面的代碼:

private Form1 _form1; 

public Form2(Form1 form1) 
{ 
    this._form1 = form1; 
} 

public void DoSomethingWithForm1() 
{ 
    this._form1.SomeControl.DoSomething(); 
} 

然後在DoSomethingWithForm1可以調用其它形式的方法和訪問控制。然而,這不是一個聰明的設計,你更願意使用數據傳輸對象或一種包含所有表單並在它們之間傳遞數據的FormRepository,這樣你的表單就不必知道對方。

+0

哦,是的,我明白了。 –

0

生成的MainForm的所有控件的公共領域和訪問它。

+0

嗨,我知道。我所問的如何不以派生形式查看控件並同時訪問控件。 –

1

不知道這是否是最好的方法! 但想不出你通過 「這個」 通過構造這就可以讓你再訪問形式

0

您可以從「私有」更改接入類型裏面你有公共職能的「保護」。它可以在代碼和使用GUI設計完成。 在GUI設計稱這種財產「修改器」

+0

嘿,我已經做到了,但我仍然看到派生形式的控件。 –

+0

可能是我誤解了你,但是如果你從一些BaseForm繼承而不是你在InheritedForm上接收到BaseForm的所有內容。如果你不想要這個,就不要這樣做。使用@CodeCaster方法。 請更具體。 – VMykyt

0

可能會像下面這樣,決定是否顯示基本控件。

public partial class baseForm : Form 
    { 
     bool canShowControls; 

     public baseForm(bool canShowBaseControls) 
      : this() 
     { 
      InitializeComponent(); 
      canShowControls = canShowBaseControls; 
     } 
     public baseForm() 
     { 
      InitializeComponent(); 
     } 
     protected override void OnLoad(EventArgs e) 
     { 
      base.OnLoad(e); 
      HideControls(); 
     } 

     void HideControls() 
     { 
      this.button1.Visible = canShowBaseControls; 
      this.txtBox.Text = canShowBaseControls; 
     } 
    } 


public partial class childForm : baseForm 
    { 
     public childForm() 
     { 
      InitializeComponent(); 
     } 
     public childForm(bool canShowBaseControl = true) 
      : base(canShowBaseControl) 
     { 

     } 
    } 
+0

噢,我明白了。我不需要繼承我想要使用其控件的表單。 –

+0

好吧,現在將其作爲編輯或評論發佈到您的OP,以便人們不再試圖回答您的問題。 – sq33G

0

我不知道的任何方式改變在設計時子窗體從父窗體控件的默認屬性值。您可以將代碼添加到Form_Load以更改子級中的值。

要清楚:雖然你打開的子窗體繼承了它的開啓者,但它們是而不是的同一個實例。您將需要將主窗體實例作爲參數傳遞給子窗體的構造函數。

PopupForm myPopupForm = new PopupForm(this); 


// PopupForm.cs 
public class PopupForm : MainForm { 
    MainForm _opener; 

    public PopupForm(MainForm opener) { 
     _opener = opener; 
    } 
} 
相關問題