我在winforms中使用SplitterPanel,在右侧我想要一个显示2列下拉列表的自定义下拉列表控件。
问题在于,有两列我希望能够拥有比实际下拉列表更大的下拉列表区域,因此如果列表不适合分割区域,则与SplitterPanel重叠。
我已尝试使用.BringToFront();
,但这不适用于SplitterPanel并且隐藏了控件。我来自一个网络背景,我会使用z-index,但我对winforms感到难过。请参阅下面的问题图片。
有谁知道如何解决这个问题?
答案 0 :(得分:1)
z-index将确定哪个子控件位于更高位置,并且可以与其他子控件重叠。但是当你想要一个(真实的而不是贬低或暗示)孩子重叠其自己的容器时,它永远不会有帮助。这从未发生过;由于CheckedListBox
是拆分面板的子项,因此它永远不会重叠。
您需要让CheckedListBox
不在分割器面板内,而是在Parent
内,这样他们就是'兄弟'。我们假设SplitContainer
位于TabPage tabPage8
。然后,您可以通过将其移动到该tabPage来完整显示它:
moveCtlToTarget(tabPage8, checkedListBox1);
使用此功能。
void moveCtlToTarget(Control target, Control ctl)
{
// get screen location of the control
Point pt = ctl.PointToScreen(Point.Empty);
// move to the same location relative to the target
ctl.Location = target.PointToClient(pt);
// add to the new controls collection
ctl.Parent = target;
// move all up
ctl.BringToFront();
}
由于我不知道您如何创建和展示它,因此重置它取决于您。请注意,现在它不再位于拆分面板中,当您移动拆分器时它不会移动。
您可能只想在第一次执行此操作,然后将其与ComboBox
..
答案 1 :(得分:1)
TaW上面的回答帮助我解决了我的问题。我根据我将参数移动到方法中的情况稍微修改了一下,因为我已经将我的复选框控件设置为控件的属性,并通过循环父级直到我到达顶部来获得目标。
private void moveCtlToTarget()
{
Control Target = Parent;
while (Target.Parent != null)
Target = Target.Parent;
Point pt = CheckBox.PointToScreen(Point.Empty);
CheckBox.Location = Target.PointToClient(pt);
CheckBox.Parent = Target;
CheckBox.BringToFront();
}