面板有多种形式,选择最上面的按钮
Panel with multiple forms, choose top most with button
所以我有一个主菜单,旁边有按钮,还有一个面板是我的 "main display area" (panelactive)。
当我单击一个表单按钮来填充面板活动时,我需要启动相关表单并显示在最顶部。
如果它已经处于活动状态,我希望它能排在首位。
我有这个代码
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();
}
但这里的问题是调用新表单填充面板后,每个表单都不会"hide"。
我确实尝试了 VISIBLE,但效果很好。但是它只在表格被初始化后才有效。但是我不希望在启动时初始化所有表格,因为用户很可能只会使用一种表格,我有 6 个选择,其中一个非常占用内存。
所以我需要:
- 检查是否启动
- 如果没有,启动并移动到顶部
- 如果是,只显示它并隐藏其他启动的表单,这样以后就不必重新加载了..
我已经尝试过了,但我只是想不通如何检查所有表格是否存在以及是否可见等。
还是我做的完全错了??
谢谢指教。
刚格尔
正在做一个案例陈述,然后永远做这个案例我需要做什么??
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;
}
更新 1:
按照建议将我的表单转换为用户控件。
我现在似乎无法让 oCon 不为空。好像没有识别出控件已经存在!
UserControl oCon = (from UserControl uc in panelactive.Controls where uc.GetType() == typeof(UserControl) && uc.Name == "frmpackmenu" select uc).FirstOrDefault();
if (oCon == null)
{
frmpackmenu frmpackmenu = new frmpackmenu(topack, tocheck, total);
panelactive.Controls.Add(frmpackmenu);
frmpackmenu.Dock = DockStyle.Fill;
frmpackmenu.BringToFront();
}
else
{
oCon.BringToFront();
}
用户控件解决方案。这将测试您的面板是否已经拥有控件(按名称 - 但您可以修改它以使用类型,或者任何您想要的字面意思。
创建一个新项目,并将其粘贴到命名空间块中(我不知道您将其命名为什么。可能是 WindowsFormsApp1,或其他)。
我动态地创建了所有内容,因此您无需与设计人员打交道即可使其正常工作。它将记录面板中有多少 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());
}
}
所以我有一个主菜单,旁边有按钮,还有一个面板是我的 "main display area" (panelactive)。
当我单击一个表单按钮来填充面板活动时,我需要启动相关表单并显示在最顶部。 如果它已经处于活动状态,我希望它能排在首位。
我有这个代码
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();
}
但这里的问题是调用新表单填充面板后,每个表单都不会"hide"。
我确实尝试了 VISIBLE,但效果很好。但是它只在表格被初始化后才有效。但是我不希望在启动时初始化所有表格,因为用户很可能只会使用一种表格,我有 6 个选择,其中一个非常占用内存。
所以我需要:
- 检查是否启动
- 如果没有,启动并移动到顶部
- 如果是,只显示它并隐藏其他启动的表单,这样以后就不必重新加载了..
我已经尝试过了,但我只是想不通如何检查所有表格是否存在以及是否可见等。
还是我做的完全错了??
谢谢指教。 刚格尔
正在做一个案例陈述,然后永远做这个案例我需要做什么??
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;
}
更新 1: 按照建议将我的表单转换为用户控件。
我现在似乎无法让 oCon 不为空。好像没有识别出控件已经存在!
UserControl oCon = (from UserControl uc in panelactive.Controls where uc.GetType() == typeof(UserControl) && uc.Name == "frmpackmenu" select uc).FirstOrDefault();
if (oCon == null)
{
frmpackmenu frmpackmenu = new frmpackmenu(topack, tocheck, total);
panelactive.Controls.Add(frmpackmenu);
frmpackmenu.Dock = DockStyle.Fill;
frmpackmenu.BringToFront();
}
else
{
oCon.BringToFront();
}
用户控件解决方案。这将测试您的面板是否已经拥有控件(按名称 - 但您可以修改它以使用类型,或者任何您想要的字面意思。
创建一个新项目,并将其粘贴到命名空间块中(我不知道您将其命名为什么。可能是 WindowsFormsApp1,或其他)。
我动态地创建了所有内容,因此您无需与设计人员打交道即可使其正常工作。它将记录面板中有多少 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());
}
}