Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用面板的选项卡系统_C#_Winforms_Tabs_Panel - Fatal编程技术网

C# 使用面板的选项卡系统

C# 使用面板的选项卡系统,c#,winforms,tabs,panel,C#,Winforms,Tabs,Panel,我试着把它放到一个面板可以看到的地方,然后把它发送到前面,这样就可以看到它并与之交互,就像这样 private void SettingsButton_Click(object sender, EventArgs e) { SettingsPanel.Visible = true; SettingsPanel.BringToFront(); } 问题是,单击几个按钮后,它要么显示错误的面板,要么根本不显示。有办法解决这个问题吗 编辑:在你们提问之前,我正在使用WinForms。

我试着把它放到一个面板可以看到的地方,然后把它发送到前面,这样就可以看到它并与之交互,就像这样

private void SettingsButton_Click(object sender, EventArgs e)
{
    SettingsPanel.Visible = true;
    SettingsPanel.BringToFront();
}
问题是,单击几个按钮后,它要么显示错误的面板,要么根本不显示。有办法解决这个问题吗


编辑:在你们提问之前,我正在使用WinForms。

好吧,我错了,WinForms比我想象的要聪明。你可以做一个测试。我不确定你到底想做什么,但这应该会对你有所帮助。首先,我们将构建一个小型WinForms应用程序。除了一个例外,我们不会设置我们在屏幕上放置的控件的任何属性:

  • 创建新的WinForms应用程序
  • 在设计器中,在窗体上放置一个面板(将命名为
    panel1
  • 在属性窗格中,将
    边框样式设置为FixedSingle(这是我们要设置的唯一属性)
  • 制作该面板的两份副本(
    panel2
    panel3
    )。定位它们,使面板完全不重叠
  • 在每个面板上放置两个控件(我在每个控件上放置标签(标签1-3)和文本框(也是1-3))
  • 在每个面板旁边(排列方式不重叠),在表格上放置三个按钮(按钮1-3),使每个按钮在视觉上与编号相似的面板相关联
  • 复制
    panel3
    ,包括其包含的控件(以便获得
    panel4
    label4
    textbox4
    )。定位复制品,使其与面板3明显重叠
  • 现在我们来看看设计器为表单创建的代码。不要弄乱这段代码(你可以,但如果你不知道你在做什么,它可能会变得很糟糕——我们保持简单)

  • 在解决方案资源管理器中,单击Form1.cs左侧的未填充三角形。请注意,它会旋转并变成实体。还请注意,将显示Form1.Designer.cs。这是一个通常隐藏的源文件,其中包含与窗体及其上的控件相对应的所有设计器创建的代码
  • 打开Form1.Designer.cs
  • 单击Windows窗体设计器生成的代码旁边的小灰色加号图标
  • 检查文件。请注意,在designer中执行的每个操作在designer.cs文件中都有相应的代码行(或多或少)
  • 查看其中一个面板的代码(例如
    panel1
    请确保它包括:

    this.panel1.Controls.Add(this.textBox1);
    this.panel1.Controls.Add(this.label1);
    
  • 一直向下滚动到
    表单1
    代码,查看面板和按钮是否添加到表单的控件集合:
  • 比如:

    请注意,顺序是相反的。顺序很重要,它为表单和表单上的控件设置Z顺序(即重叠的部分)

    为按钮布线

    选择所有三个按钮,然后按
    。这将打开Form1.cs文件并生成三个按钮单击处理程序,您可以填写这些处理程序

    将此代码用于三个按钮处理程序:

     private void button1_Click(object sender, EventArgs e) {
         var wasVisible = panel1.Visible;
         panel1.Visible = !wasVisible;
     }
    
     private void button2_Click(object sender, EventArgs e) {
         panel2.BringToFront();
     }
    
     private void button3_Click(object sender, EventArgs e) {
         panel3.BringToFront();
     }
    
    第一个将切换第一个面板的可见性(我添加了一个额外的变量,这样您就可以设置断点并查看发生了什么)。第二个将
    panel2
    带到前面,改变其Z顺序(称为Z顺序,因为屏幕上的位置是以X和Y为单位测量的,重叠位置与屏幕的“深度”或Z坐标相关)。最后一个对
    面板3
    执行相同的操作

    运行程序

    • 当你按下第一个按钮时,第一个面板和它的控件消失了(这让我很惊讶,WinForms比我想象的要聪明)
    • 当您按下第二个按钮时,似乎什么也没有发生。这是因为
      panel2
      唯一相交的是表单,
      panel2
      已经覆盖了表单,因此您看不到任何效果。(因为WinForms比我想象的要聪明)
    • 按下第三个按钮时,
      panel2
      (及其控件)跳转到控件堆栈的前面,覆盖
      panel4
      的相交部分

    这是否有助于您理解
    可见
    BringToFront()
    的工作原理?

    您所描述的内容与
    选项卡控件类似。下面是一个例子:

    只需使当前面板可见并停靠以填充,即可对其进行管理。隐藏其他面板

    public partial class FormTabsAlternative
        : Form
    {
        int         m_current = 0;
        List<Panel> m_tabs    = new List<Panel>();
    
        public FormTabsAlternative()
        {
            InitializeComponent();
    
            AddTab(pnl1);
            AddTab(pnl2);
            AddTab(pnl3);
            AddTab(pnl4);
    
            SetUpTabsAndButtons();
        }
    
        private void AddTab(Panel pnl)
        {
            m_tabs.Add(pnl);
    
            pnl.Dock = DockStyle.Fill;
        }
    
        private void OnLeftClick(object sender, EventArgs e)
        {
            if (m_current > 0)
            {
                m_current--;
    
                SetUpTabsAndButtons();
            }
        }
    
        private void OnRightClick(object sender, EventArgs e)
        {
            if (m_current < m_tabs.Count - 1)
            {
                m_current++;
    
                SetUpTabsAndButtons();
            }
        }
    
        private void SetUpTabsAndButtons()
        {
            for (int index = 0; index < m_tabs.Count; index++)
            {
                var panel     = m_tabs[index];
    
                panel.Visible = index == m_current;
            }
    
            btnLeft .Enabled = m_current > 0;
            btnRight.Enabled = m_current < m_tabs.Count - 1;
        }
    }
    
    公共部分类FormsTabernative
    :表格
    {
    int m_电流=0;
    列表m_tabs=新列表();
    公共形式的
    {
    初始化组件();
    AddTab(pnl1);
    AddTab(pnl2);
    AddTab(pnl3);
    AddTab(pnl4);
    SetUpTabsAndButtons();
    }
    专用无效添加选项卡(面板pnl)
    {
    m_制表符。添加(pnl);
    pnl.Dock=DockStyle.Fill;
    }
    私有void OnLeftClick(对象发送方,事件参数e)
    {
    如果(m_电流>0)
    {
    m_电流--;
    SetUpTabsAndButtons();
    }
    }
    右键单击时的私有void(对象发送方,事件参数e)
    {
    如果(m_电流0;
    btnRight.Enabled=m_电流
    我假设您的面板上有控件。我还猜测您希望有选择地控制面板及其包含的控件的可见性。您可能不想使用面板的Z顺序玩游戏。控制哪个控件位于最前面的。作为猜测,如果你把
    public partial class FormTabsAlternative
        : Form
    {
        int         m_current = 0;
        List<Panel> m_tabs    = new List<Panel>();
    
        public FormTabsAlternative()
        {
            InitializeComponent();
    
            AddTab(pnl1);
            AddTab(pnl2);
            AddTab(pnl3);
            AddTab(pnl4);
    
            SetUpTabsAndButtons();
        }
    
        private void AddTab(Panel pnl)
        {
            m_tabs.Add(pnl);
    
            pnl.Dock = DockStyle.Fill;
        }
    
        private void OnLeftClick(object sender, EventArgs e)
        {
            if (m_current > 0)
            {
                m_current--;
    
                SetUpTabsAndButtons();
            }
        }
    
        private void OnRightClick(object sender, EventArgs e)
        {
            if (m_current < m_tabs.Count - 1)
            {
                m_current++;
    
                SetUpTabsAndButtons();
            }
        }
    
        private void SetUpTabsAndButtons()
        {
            for (int index = 0; index < m_tabs.Count; index++)
            {
                var panel     = m_tabs[index];
    
                panel.Visible = index == m_current;
            }
    
            btnLeft .Enabled = m_current > 0;
            btnRight.Enabled = m_current < m_tabs.Count - 1;
        }
    }