所以我有一个主菜单,侧面有按钮,面板是我的“主显示区域”(panelactive)。
当我单击表单的按钮来填充窗格时,我需要显示相关表单并将其显示为最顶层。 如果它已经激活我想要它只是来到TOP。
我有这个代码
for /F "usebackq tokens=*" %%X in ("N:\Some Directory\Some File.txt") do if /I "%foldername%" EQU "%%X" goto SKIPIT
REM Do your normal stuff here
:SKIPIT
但问题是,在调用新表单填充面板后,每个表单都不会“隐藏”。
我确实尝试了可见的VISIBLE ..然而它只在表单初始化后才有效..但是我不希望所有表单在启动时初始化,因为很可能只有一个表单将被用户使用并且我有一个选择6,其中一个是相当重的记忆。
所以我需要:
我已经尝试过了,我无法理解如何检查所有表格,如果它们在那里以及是否可见等等。
或者我这样做完全错了吗?
Thansk寻求建议。 Gangel
正在做一个案例陈述然后这样做,我需要做什么?
Form g = Application.OpenForms["frmpackmenu"];
if (g == null)
{
frmpackmenu frmpackmenu = new frmpackmenu(topack, tocheck, total);
frmpackmenu.TopLevel = false;
panelactive.Controls.Add(frmpackmenu);
frmpackmenu.Dock = DockStyle.Fill;
frmpackmenu.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
frmpackmenu.Show();
}
else
{
g.Show();
}
更新1 : 按照建议将我的表单转换为Usercontrol。
我现在似乎无法让oCon变得不那么努力。似乎没有确定控件已经存在!
if (collectmenu == null)
{
frmcollectmenu frmcollectmenu = new frmcollectmenu();
frmcollectmenu.TopLevel = false;
panelactive.Controls.Add(frmcollectmenu);
frmcollectmenu.Dock = DockStyle.Fill;
frmcollectmenu.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
frmcollectmenu.Show();
}
else
{
collectmenu.Visible = true;
}
if (packmenu != null)
{
packmenu.Visible = false;
}
if (checkmenu != null)
{
checkmenu.Visible = false;
}
答案 0 :(得分:1)
UserControl解决方案。这将测试你的面板是否已经拥有控件(按名称 - 但你可以修改它以使用类型,或任何你想要的。
创建一个新项目,并将其粘贴到命名空间块中(我不知道你将它命名为什么.WindowsFormsApp1可能或者其他)。
我动态创建了所有内容,因此您不需要与设计师混淆以使其工作。它将记录面板中有多少UC,因此您知道它抓住现有的UC,而不是创建一个新的。
这里的关键是,对于UC,您需要做的就是" BringToFront"其他一切都只是为你处理。它不会创建不必要的。我相信这就是你想要的:
public partial class Form1 : Form
{
Panel pnlMain;
Panel pnlSelect;
public Form1()
{
InitializeComponent();
//You will already have all of this - this is just to make a minimal-complete example without the designer.
pnlSelect = new Panel();
pnlMain = new Panel();
this.Controls.AddRange(new Control[] { pnlSelect, pnlMain });
pnlSelect.Dock = DockStyle.Left;
pnlMain.Dock = DockStyle.Right;
pnlSelect.Width = (int)(this.Width * 0.2);
pnlMain.Width = this.Width - pnlSelect.Width - 25;
for(int i=0;i<6;i++)
{
Button btn = new Button();
btn.Name = i.ToString();
btn.Text = i.ToString();
pnlSelect.Controls.Add(btn);
btn.Location = new Point(btn.Location.X, btn.Height * i + 5);
btn.Click += Btn_Click;
}
//just to see a difference
pnlMain.BackColor = Color.Green;
}
private void Btn_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;
UserControl oCon = (from Control uc in pnlMain.Controls where uc.GetType() == typeof(UserControl) && uc.Name == btn.Name select uc).FirstOrDefault();
if(oCon == null)
{
oCon = new UserControl();
oCon.Name = btn.Name;
pnlMain.Controls.Add(oCon);
Label lbl = new Label();
lbl.Text = oCon.Name;
oCon.Controls.Add(lbl);
//just to see a difference
oCon.BackColor = Color.Blue;
}
oCon.BringToFront();
Console.WriteLine("pnlMain has: {0} Children.", pnlMain.Controls.Count.ToString());
}
}