如何访问继承表单上的控件?

时间:2009-11-17 16:29:53

标签: c# winforms inheritance dockpanel dockpanel-suite

我在winforms应用程序中使用DockPanel Suite。 DockContent类派生自System.Windows.Forms.Form类,我的两个表单dockRounds和dockToolbox继承自DockContent类。

这是我第一次这样做,这可能是一个愚蠢的问题,但在运行时,如何访问dockRounds和dockToolbox表单的控件?

以下是我首次运行应用时加载两个表单的方法:

public partial class frmMainNew : Form

    clsMWDockPanel mapPanel;
    dockToolbox dockT = new dockToolbox();
    dockRounds dockR = new dockRounds();

    public frmMainNew()
    {
        InitializeComponent();

        dockPanel = new DockPanel();

        SuspendLayout();

        dockPanel.Parent = panelMain;
        dockPanel.Dock = DockStyle.Fill;
        dockPanel.DefaultFloatWindowSize = new Size(108, 528);

        dockPanel.BringToFront();
        dockPanel.BackColor = Color.Transparent;
        dockPanel.DocumentStyle = DocumentStyle.DockingSdi;

        ResumeLayout();

        string error = "Errors:\r\n";
        try
        {
            loadRounds();
            loadToolbox();
        }
        catch (Exception)
        {
            error = error + "The Toolbox and/or Rounds menu could not be created\r\n";
        }

    }

    public void loadToolbox()
    {
        dockT.CloseButton = false;
        dockT.ShowHint = DockState.Float;
        dockT.Text = "Toolbox";
        dockT.BackColor = Color.WhiteSmoke;
        dockT.Icon = this.Icon;
        dockT.Show(dockPanel);
    }

    public void loadRounds()
    {
        if (mapPanel == null)
        {
            CreateMapPanel().Show(dockPanel, DockState.Document);
        }

        mapMain.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
        //mapMain.BringToFront();

        dockR.CloseButton = false;
        dockR.ShowHint = DockState.DockRightAutoHide;
        dockR.Text = "Rounds Menu";
        dockR.BackColor = Color.WhiteSmoke;
        dockR.Icon = this.Icon;
        dockR.Show(dockPanel);
    }

    DockContent CreateMapPanel()
    {
        mapPanel = new clsMWDockPanel();
        mapPanel.ShowHint = DockState.Document;
        mapPanel.Controls.Add(mapMain);

        return mapPanel;
    }

clsMWDockPanel mapPanel; dockToolbox dockT = new dockToolbox(); dockRounds dockR = new dockRounds(); public frmMainNew() { InitializeComponent(); dockPanel = new DockPanel(); SuspendLayout(); dockPanel.Parent = panelMain; dockPanel.Dock = DockStyle.Fill; dockPanel.DefaultFloatWindowSize = new Size(108, 528); dockPanel.BringToFront(); dockPanel.BackColor = Color.Transparent; dockPanel.DocumentStyle = DocumentStyle.DockingSdi; ResumeLayout(); string error = "Errors:\r\n"; try { loadRounds(); loadToolbox(); } catch (Exception) { error = error + "The Toolbox and/or Rounds menu could not be created\r\n"; } } public void loadToolbox() { dockT.CloseButton = false; dockT.ShowHint = DockState.Float; dockT.Text = "Toolbox"; dockT.BackColor = Color.WhiteSmoke; dockT.Icon = this.Icon; dockT.Show(dockPanel); } public void loadRounds() { if (mapPanel == null) { CreateMapPanel().Show(dockPanel, DockState.Document); } mapMain.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; //mapMain.BringToFront(); dockR.CloseButton = false; dockR.ShowHint = DockState.DockRightAutoHide; dockR.Text = "Rounds Menu"; dockR.BackColor = Color.WhiteSmoke; dockR.Icon = this.Icon; dockR.Show(dockPanel); } DockContent CreateMapPanel() { mapPanel = new clsMWDockPanel(); mapPanel.ShowHint = DockState.Document; mapPanel.Controls.Add(mapMain); return mapPanel; }

非常感谢提前

莱迪

4 个答案:

答案 0 :(得分:4)

您可以使用多种策略来实现不同表单上对象之间的通信/链接。注意:我的回复不会解决与DockPanelSuite特别相关的任何问题,也不会考虑“二级”表单之间的区别是“独立”(即,它们不是由MainForm“拥有”)或者是制作儿童主要形式的形式。这是一种有意识的选择,基于相信您所询问的内容与实施中可能存在的变化无关。

  1. 最简单的策略(如果对很多控件来说很繁琐)是在辅助表单中声明公共属性,公开要从主表单操作的控件。例如,假设Form2有一个按钮,您想在主窗体上处理其click事件:
  2. 在Form2中定义一个属性,如:

    public Button form2Button
    {
        get { return button1; }
    }
    

    现在,在主窗体的Load事件中,假设是创建Form2实例的位置,您可以订阅Form2上Button按钮的Click事件:

    Form2 myForm2;
    Form3 myForm3;
    
    private void Form1_Load(object sender, EventArgs e)
    {
       myForm2 = new Form2();
       myForm2.form2Button.Click += new EventHandler(form2Button_Click);
    
       myForm3 = new Form3();
    }
    

    您可以很容易地想象,在Form3中,您使用公共属性公开了一个TextBox,就像在Form2上公开Button一样。

    因此,您可以为Form2上的Button单击实现MainForm的事件处理程序:

    public void form2Button_Click(object sender, EventArgs e)
    {
        // do something here with the TextBox on Form3 
        // myForm3.theTextBox.Text = 
    }
    

    ......其他策略......

    1. 在您的辅助表单中,例如,按下按钮可以引发主要表单(或Form2所公开的任何其他实体)可以订阅的公共事件,然后将适当的任何内容发送到适当的目标

    2. 您可以将更高级别的消息传递抽象为发布者发送消息的单个(可能是静态的)类,并将消息分派给已注册的侦听器。

    3. 最后,您可能会对此感兴趣:

      Using The Controls Of One Form Into Another

      最好,

答案 1 :(得分:1)

您的类,dockRounds和dockToolbox应该公开您要访问的任何属性/事件。因此,如果您想要连接控件的事件,请将其路由到公共事件。

答案 2 :(得分:0)

您是否尝试过访问Controls媒体资源?

var controls = dockRounds.Controls;

答案 3 :(得分:0)

您可以在控件上设置访问修饰符,使其可以随意访问。默认为“私有”,这就是您无法从主窗体访问控件的原因。

在Visual Studio中,在“属性”选项卡上,有一个“修改器”属性,用于设置在生成的设计器文件中使用的访问修饰符。

将其设置为“Public”,您可以从主窗体访问该控件。

当我从另一个表单继承一个表单时,我刚刚使用过它。通过将修饰符设置为“受保护”(或“受保护的内部”),我能够访问基类中定义的控件。