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

标签 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()
    {
        初始化组件();

        dockPanel = new DockPanel();

        暂停布局();

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

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

        恢复布局();

        string error = "错误:\r\n";
        尝试
        {
            加载回合();
            加载工具箱();
        }
         catch (异常)
        {
            error = error + "无法创建工具箱和/或 Rounds 菜单\r\n";
        }

    }

    公共(public)无效 loadToolbox()
    {
        dockT.CloseButton = false;
        dockT.ShowHint = DockState.Float;
        dockT.Text = "工具箱";
        dockT.BackColor = Color.WhiteSmoke;
        dockT.Icon = this.Icon;
        dockT.Show(dockPanel);
    }

    公共(public)无效 loadRounds()
    {
        如果( map 面板 == 空)
        {
            CreateMapPanel().Show(dockPanel, DockState.Document);
        }

        mapMain.Anchor = AnchorStyles.Top | AnchorStyles.底部 | AnchorStyles.左| AnchorStyles.Right;
       //mapMain.BringToFront();

        dockR.CloseButton = false;
        dockR.ShowHint = DockState.DockRightAutoHide;
        dockR.Text = "回合菜单";
        dockR.BackColor = Color.WhiteSmoke;
        dockR.Icon = this.Icon;
        dockR.Show(dockPanel);
    }

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

        返回 map 面板;
    }

提前致谢

莱迪

最佳答案

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

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

在 Form2 中定义如下属性:

public Button form2Button
{
    get { return button1; }
}

现在在主窗体的 Load 事件中,假设这是创建 Form2 实例的地方,您可以订阅 Form2 上按钮的 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,您使用公共(public)属性公开了它,就像在 Form2 上公开 Button 一样。

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

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

...其他策略...

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

  2. 您可以将较高级别的一般消息传递抽象为一个(可能是静态的)类,发布者在该类中发送消息,然后将消息分派(dispatch)给已注册的监听器。

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

Using The Controls Of One Form Into Another

最好的,

关于c# - 如何访问继承表单上的控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1750074/

相关文章:

c# - 以编程方式设置按钮图像

c# - 关于锁对象和子类的问题

c# - 如何在 WinForm 中使用 GraphicsPath 绘制圆形进度条饼图?

c# - 如何使用 DataContractJsonSerializer 序列化匿名类型

c# - 自定义按钮: Click through label

c# - 保持一个拆分容器面板固定宽度?

java - 如何使用反射动态获取调用者实例的实例

c++ - 为什么我可以通过类而不是纯代码修改 const 变量。 C++

c# - DataTable 到 Array of arrays

c# - Xamarin.Forms Navigation.PushAsync 在 ContentView 中不起作用