【问题标题】:Hiding and showing panels隐藏和显示面板
【发布时间】:2012-11-17 19:06:50
【问题描述】:

编辑
我已经找到并发布了解决方案。

我正在尝试为我的应用程序制作一个安装程序,并且我正在尝试使用面板来执行此操作(我不知道这是否是一种好方法,但这为我提供了更多自定义选项,而不是使用安装屏蔽程序)。最好的方法是什么?
这是我知道的代码:

C# 代码

foreach (var c in Controls)
{
    if (!(c is Panel)) continue;
    if (c.Name == "pnlBottom") continue;
        
    c.Visible = c.Name.Contains(_currentPanel.ToString());
    
    if (c.Visible) return;
}

【问题讨论】:

  • 我不确定您的具体问题是什么,但如果您只是想显示/隐藏面板,那么您可以直接进行。 _firstPanel.Visible = true; _secondPanel.Visible = false;然后,一旦用户通过单击按钮或其他方式从第一个面板移动到第二个面板,您只需 _firstPanel.Visible = false; _secondPanel.Visible = true;
  • 但是如果我有 10 个面板怎么办?有没有办法让它变得更容易? (让我的代码更短?)
  • 您可以将上面的代码转换为一个方法,并传入您要显示的面板的名称(panelNameToShow),然后隐藏所有其他面板。逻辑与您所​​拥有的非常相似,您需要将 c.Name.Contains(_currentPanel.ToString()) 更改为 c.Name.Equals(panelNameToShow)
  • Okai,听起来这可能是解决方案,是的,谢谢,我会试试这个:)!
  • 祝你好运 :) 如果你不能让它工作,我可以发布方法。我现在只是不在装有 Visual Studio 的计算机旁。

标签: c# .net installation panel


【解决方案1】:

试试这个,它会改变单个面板的可见性:

private void PanelVisible(string panelName, bool visible)
{
    var panel = this.Controls.OfType<Panel>().FirstOrDefault(p => p.Name == panelName);
    if (panel != default(Panel)) panel.Visible = visible;
}

如果你想让所有东西都不可见,但只有一个:

private void PanelVisible(string panelName)
{
    foreach(var panel in this.Controls.OfType<Panel>().Where(p=>p.Name!="pnlBottom"))
    {
        panel.Visible = panel.Name == panelName;
    }
}

【讨论】:

  • 我忘记添加关于名为“pnlBottom”的面板的例外情况。见编辑
  • 功能和智能 where :D +1
【解决方案2】:

这是我用来显示面板的代码:

foreach (var c in Controls)
{
    if (!(c is Panel)) continue;
    if (c.Name == "pnlBottom") continue;
        
    c.Visible = c.Name.Contains(_currentPanel.ToString());
    
    if (c.Visible) return;
}

这是我用来调用它并浏览我的面板的代码:
下一步按钮

private void btnNext_Click(object sender, EventArgs e)
{
    if (pnlContent1.Visible) { ShowPanel("2"); return; }
    if (pnlContent2.Visible) { ShowPanel("3"); return; }
    if (pnlContent3.Visible) { ShowPanel("4"); return; }
    if (pnlContent4.Visible) { ShowPanel("5"); return; }
}

返回按钮

private void btnBack_Click(object sender, EventArgs e)
{
    if (pnlContent2.Visible) { ShowPanel("1"); return; }
    if (pnlContent3.Visible) { ShowPanel("2"); return; }
    if (pnlContent4.Visible) { ShowPanel("3"); return; }
    if (pnlContent5.Visible) { ShowPanel("4"); return; }
}

我希望这对其他人也有用:D!

【讨论】:

  • 您的代码所做的是使所有面板不可见,直到找到要使其可见的面板。这是由于您的 return 语句,因为它使代码跳出整个过程。
猜你喜欢
  • 1970-01-01
  • 2020-04-19
  • 2011-03-27
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
相关资源
最近更新 更多