我在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;
}
非常感谢提前
莱迪
答案 0 :(得分:4)
您可以使用多种策略来实现不同表单上对象之间的通信/链接。注意:我的回复不会解决与DockPanelSuite特别相关的任何问题,也不会考虑“二级”表单之间的区别是“独立”(即,它们不是由MainForm“拥有”)或者是制作儿童主要形式的形式。这是一种有意识的选择,基于相信您所询问的内容与实施中可能存在的变化无关。
在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 =
}
......其他策略......
在您的辅助表单中,例如,按下按钮可以引发主要表单(或Form2所公开的任何其他实体)可以订阅的公共事件,然后将适当的任何内容发送到适当的目标
您可以将更高级别的消息传递抽象为发布者发送消息的单个(可能是静态的)类,并将消息分派给已注册的侦听器。
最后,您可能会对此感兴趣:
Using The Controls Of One Form Into Another
最好,
答案 1 :(得分:1)
您的类,dockRounds和dockToolbox应该公开您要访问的任何属性/事件。因此,如果您想要连接控件的事件,请将其路由到公共事件。
答案 2 :(得分:0)
您是否尝试过访问Controls媒体资源?
var controls = dockRounds.Controls;
答案 3 :(得分:0)
您可以在控件上设置访问修饰符,使其可以随意访问。默认为“私有”,这就是您无法从主窗体访问控件的原因。
在Visual Studio中,在“属性”选项卡上,有一个“修改器”属性,用于设置在生成的设计器文件中使用的访问修饰符。
将其设置为“Public”,您可以从主窗体访问该控件。
当我从另一个表单继承一个表单时,我刚刚使用过它。通过将修饰符设置为“受保护”(或“受保护的内部”),我能够访问基类中定义的控件。