如何使基本表单控件在子表单C#中不可见

时间:2011-11-16 10:30:13

标签: c# winforms inheritance

我有一个主窗口表单和另一个继承它的表单。

第二种形式需要访问主窗体的控件(Buttons,PictureBox等)。 因为它继承自主窗体,所以子窗体的默认外观与主窗体的默认外观相同。

如何克服此问题并同时访问主窗体的控件?

我不想被迫再次改变我的设计!

问题解决了,Thnx的答案......

6 个答案:

答案 0 :(得分:1)

不确定这是不是最好的方法! 但是你不能通过 "这" 在构造函数中,然后允许您访问表单中的公共函数

答案 1 :(得分:1)

  

当我从主窗体继承另一个窗体时,固有的窗体的外观就像主窗体一样。

     

如何克服此问题并同时访问主窗体的控件。

好吧,根本就不要继承它。你是如何以及为什么继承它的?你想要访问什么?

如果在Form2上,您有以下代码:

private Form1 _form1;

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

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

然后在DoSomethingWithForm1中,您可以在另一个表单上调用方法和访问控件。然而,这不是一个聪明的设计,您宁愿使用数据传输对象或一种包含所有表单并在它们之间传递数据的FormRepository,因此您的表单不必彼此了解。

答案 2 :(得分:0)

将mainform上的所有控件生成为公共字段并访问它。

答案 3 :(得分:0)

您可以将访问类型从“私人”更改为“受保护”。 它既可以在代码中完成,也可以使用GUI Designed完成。 在GUI Designer中,此属性称为“修改器”

答案 4 :(得分: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)
        {

        }
    }

答案 5 :(得分:0)

我不知道在设计时如何更改子窗体中父窗体控件的默认属性值。您可以向Form_Load添加代码以更改子项中的值。

要明确:虽然您打开的子窗体继承自其开启者,但它们不是相同的实例。您需要将主表单实例作为参数传递给子表单的构造函数。

PopupForm myPopupForm = new PopupForm(this);


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

    public PopupForm(MainForm opener) {
        _opener = opener;
    }
}