C# 面板停靠问题

5

这是一个 Windows Forms 项目,只能在设计器中(即编译之前)使用鼠标操作。我有一个窗体和两个面板。panel1使用 docked 选项填充到 form1 中。panel2也填充到 form1 中,并且在 panel1 的前面(panel1 被隐藏在后面)。我的问题是,当我取消 panel2 的停靠并重新停靠时,它会停靠到 panel1 上(panel1 成为它的父级),而不是停靠到 form1 上。如何更改 panel2 的父级?

到目前为止,我想出的唯一解决方案是剪切(ctrl+x)panel2,选择 form1,然后粘贴(ctrl+v)panel2,但由于某种原因,这会删除 panel2 控件与代码之间的所有连接(例如点击 panel2 上的按钮不再起作用,尽管处理该事件的函数仍然存在)。

有更好的解决方法吗?


2
您可以将panel1取消停靠,然后将panel2从panel1中移出到Form1背景上。我也曾经为此苦苦挣扎,这总是我的解决方法,我也发现剪切和粘贴会引起很多麻烦。它也可以在代码中修复,使用设计文件。 - General Grey
@K'Leg 对我来说,这看起来非常像一个有效和正确的答案。 - gbianchi
@gbianchi 谢谢,我现在把它作为答案发布了,我应该一开始就这样做。 - General Grey
3个回答

8
将控件剪切到剪贴板上会断开事件处理程序,因此最好避免在设计器中使用剪切和粘贴。由于您正在使用设计器,在Visual Studio的“视图-其他窗口”菜单中打开“文档大纲”面板。使用箭头按钮正确设置控件的父级或停靠顺序。文档大纲窗口如下所示:

1

看起来人们喜欢我的评论答案,所以我把它放在这里作为答案

您可以取消停靠面板1,然后将面板2从面板1移动到Form1背景上。我也曾经苦苦挣扎过这个问题,总是采用这种方法解决的,因为我发现剪切和粘贴会引起很多麻烦。也可以在代码中修复,使用设计文件。


0

当您更改停靠时,面板无法更改父级!或者我没有真正理解您的问题。

但是...如果您想更改父级,请从面板控件列表中删除面板,并将其添加到窗体控件列表中。

yourPanel.Controls.Remove(yourOtherPanel);
yourForm.Controls.Add(yourOtherPanel);
yourOtherPanel.Dock = .....;

在Form1_Load等事件中添加额外的代码来更改父级似乎是一种变通方法(而且是一种难看的方法,因为它会留在最终产品中)。至于这个:“面板在更改停靠时无法更改父级!!!”-显然,它可以。我猜这取决于我(未)停靠的面板下方的控件。 - NPS
该面板通过逻辑更改其父级,一旦您将其取消停靠,则它位于panel1上,而不是表单上,因此它会发生更改。 - gbianchi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接