我在我的 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 的子窗体。这是一个有意识的选择,其基础是相信您所询问的内容与实现中的那些可能变化无关。
- 最简单的策略(如果对很多控件而言乏味)是在您的辅助窗体中声明公共(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 =
}
...其他策略...
例如,在您的辅助表单中,按下按钮可以引发一个公共(public)事件,主表单(或 Form2 公开的任何其他实体)可以订阅该公共(public)事件,然后将适当的任何内容发送到适当的目标.
您可以将较高级别的一般消息传递抽象为一个(可能是静态的)类,发布者在该类中发送消息,然后将消息分派(dispatch)给已注册的监听器。
最后,您可能对这里的讨论感兴趣:
Using The Controls Of One Form Into Another
最好的,
关于c# - 如何访问继承表单上的控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1750074/