1

我在我的 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;
    }

提前谢谢了

雷迪

4

4 回答 4

4

您可以使用多种策略来实现不同表单上的对象之间的通信/链接。注意:我在这里的回复不会解决与 DockPanelSuite 相关的任何问题,也不会考虑“辅助”表单之间的区别是“独立的”(即,它们不属于 MainForm“所有”)或制作主窗体的子窗体。这是一个有意识的选择,其基础是相信您所询问的内容与实施中的那些可能变化无关。

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

在 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 上公开按钮一样。

因此,您可以像这样为 Form2 上的按钮单击实现 MainForm 的事件处理程序:

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

...其他策略...

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

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

最后,您可能对这里的讨论感兴趣:

将一种形式的控件用于另一种形式

最好的,

于 2009-11-17T17:54:08.070 回答
1

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

于 2009-11-17T17:57:21.183 回答
1

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

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

将此设置为“公共”,您就可以从主窗体访问控件。

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

于 2013-04-17T13:09:09.660 回答
0

您是否尝试过访问Controls属性?

var controls = dockRounds.Controls;
于 2009-11-17T16:33:32.617 回答