使用面板的标签系统

时间:2019-09-22 23:27:24

标签: c# winforms tabs panel

我试图将其放置在面板可见的位置,并将其发送到前端,以便可以看到并与之交互,就像这样。

private void SettingsButton_Click(object sender, EventArgs e)
{
    SettingsPanel.Visible = true;
    SettingsPanel.BringToFront();
}

问题在于单击某些按钮后,它将显示错误的面板,或者根本不显示任何面板。有办法解决这个问题吗?

编辑:在大家问之前,我正在使用WinForms。

2 个答案:

答案 0 :(得分:0)

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

  1. 创建一个新的WinForms应用
  2. 在设计器中,将一个面板(将命名为panel1)放在表单上
  3. 在属性窗格中,将BorderStyle设置为FixedSingle(这是我们要设置的唯一属性)
  4. 制作该面板的两个副本(panel2panel3)。放置它们,使面板完全不重叠。
  5. 在每个面板上分别放置几个控件(我在其中分别放置了标签(标签1-3)和文本框(还1-3))
  6. 在每个面板旁边(排列成无重叠的地方),在窗体上放置三个按钮(按钮1-3),以使每个按钮在视觉上都与编号相似的面板相关联。
  7. 复制panel3及其包含的控件(以便您获得panel4label4textbox4)。放置副本,使其与面板3明显重叠

现在,我们将看设计师为您的表单创建的代码。不要把这段代码弄乱(可以,但是,如果您不知道自己在做什么,那么结果可能会很糟糕-而且我们会保持这种简单性。)

  1. 在解决方案资源管理器中,单击 Form1.cs 左侧的空三角形。请注意,它旋转并变成实心。另请注意,将显示Form1.Designer.cs。这是一个通常隐藏的源文件,其中包含所有由设计人员创建的代码,这些代码与该窗体以及您放置在该窗体上的控件相对应。
  2. 打开 Form1.Designer.cs
  3. 点击Windows Form Designer generated code旁边的灰色加号小图标
  4. 检查文件。请注意,您在设计器中执行的每个操作在Designer.cs文件中都有相应的代码行(或多或少)
  5. 查看其中一个面板的代码(例如panel1)。

看到它包括:

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

赞:

this.Controls.Add(this.button3);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Controls.Add(this.panel4);
this.Controls.Add(this.panel3);
this.Controls.Add(this.panel2);
this.Controls.Add(this.panel1);

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

连接按钮

选择所有三个按钮,然后按<Enter>。这将打开 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坐标)。最后一个对panel3做同样的事情。

运行程序。

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

这是否有助于您了解VisibleBringToFront()的工作方式?

答案 1 :(得分:0)

您所描述的内容类似于<slot>的替代内容。这是一个示例:

enter image description here

您可以简单地通过使其可见并停靠填充来管理当前面板。隐藏其他面板。

with cte as (
    select 1 as ctr, t2.Qty, t1.EventID, t1.DocumentId, t1.EventDesc from tableA t1  
    inner join tableB t2 on t2.DocumentId = t1.DocumentId       
    union all 
    select ctr + 1, Qty, EventID, DocumentId, EventDesc  from cte
    where ctr <= Qty
)select *, concat('ITEM_TAG_', right('000'+ cast(ctr AS varchar(3)),3)) from cte
option (maxrecursion 0);