我试图将其放置在面板可见的位置,并将其发送到前端,以便可以看到并与之交互,就像这样。
private void SettingsButton_Click(object sender, EventArgs e)
{
SettingsPanel.Visible = true;
SettingsPanel.BringToFront();
}
问题在于单击某些按钮后,它将显示错误的面板,或者根本不显示任何面板。有办法解决这个问题吗?
编辑:在大家问之前,我正在使用WinForms。
答案 0 :(得分:0)
好的,所以我错了,WinForms比我想象的要聪明。这是您可以做的测试。我不确定您要做什么,但这可以帮助您。首先,我们将构建一个小型WinForms应用程序。除了一个例外,我们将不会设置屏幕上放置的控件的任何属性:
panel1
)放在表单上BorderStyle
设置为FixedSingle(这是我们要设置的唯一属性)panel2
和panel3
)。放置它们,使面板完全不重叠。panel3
及其包含的控件(以便您获得panel4
,label4
和textbox4
)。放置副本,使其与面板3明显重叠现在,我们将看设计师为您的表单创建的代码。不要把这段代码弄乱(可以,但是,如果您不知道自己在做什么,那么结果可能会很糟糕-而且我们会保持这种简单性。)
Windows Form Designer generated code
旁边的灰色加号小图标panel1
)。 看到它包括:
this.panel1.Controls.Add(this.textBox1);
this.panel1.Controls.Add(this.label1);
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
做同样的事情。
运行程序。
panel2
相交的唯一东西是表单,并且panel2
已经覆盖了表单,因此您看不到任何效果。 (并且因为WinForms比我想象的要聪明)panel2
(及其控件)会跳到控件堆栈的前面,覆盖panel4
的相交部分。这是否有助于您了解Visible
和BringToFront()
的工作方式?
答案 1 :(得分:0)
您所描述的内容类似于<slot>
的替代内容。这是一个示例:
您可以简单地通过使其可见并停靠填充来管理当前面板。隐藏其他面板。
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);