将列表框置于其他控件之上

时间:2011-12-16 15:00:08

标签: c# winforms

我附上的图片更清楚。图片中的列表框就像自动完成一样,并在用户输入时向用户显示建议。问题是此列表框的底部位于其他控件下,因此您无法看到此列表框的垂直滚动条的向下箭头。如何将其置于其他控件之上?

enter image description here

4 个答案:

答案 0 :(得分:2)

ListBox包含错误的Parent。您不希望拆分器面板作为父级,它将剪切它。你不能轻易地与设计师一起给它正确的父母。使用视图+(其他Windows)+文档大纲。将ListBox从拆分器面板拖到窗体中。

答案 1 :(得分:1)

我在这里猜测,因为你的照片没有显示,但你可以使用ListBox.BringToFront()ListBox.SetChildIndex()之类的东西吗?这与此问题类似:

Bring Winforms control to front

如果你没有直接访问有问题的列表框,我想这对你没有多大帮助..

答案 2 :(得分:1)

我想如果您将ListBox控件添加到表单中并不完全正确。我猜你是在它显示的地方添加它,因此,重叠它的控件是在容器的其他部分内。如果要显示对所有其他控件的控件,则该控件将需要在整个容器区域上。因此,它不是对“Karyotype Entry”容器的一些子控件,而应该是所有三个表单部分的父容器的子容器。

答案 3 :(得分:1)

您可以将ListBox放在不同的表单中,并在需要完成列表时调用/显示表单。这将节省您不必担心ListBox是最顶层的。

使用此方法的方法是,您必须对自动完成表单进行编码,以便它不会从主表单中窃取焦点。

这里的代码可以帮助您,以防万一你想知道如何在没有激活的情况下显示表单(窃取焦点)。

private const int SW_SHOWNOACTIVATE = 4;
private const int HWND_TOPMOST = -1;
private const uint SWP_NOACTIVATE = 0x0010;

[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
static extern bool SetWindowPos(
     int hWnd,           // window handle
     int hWndInsertAfter,    // placement-order handle
     int X,          // horizontal position
     int Y,          // vertical position
     int cx,         // width
     int cy,         // height
     uint uFlags);       // window positioning flags

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

static void ShowInactiveTopmost(Form frm)
{
     ShowWindow(frm.Handle, SW_SHOWNOACTIVATE);
     SetWindowPos(frm.Handle.ToInt32(), HWND_TOPMOST,
     frm.Left, frm.Top, frm.Width, frm.Height,
     SWP_NOACTIVATE);
}

您也可以尝试覆盖ShowWithoutActivation属性。

protected override bool ShowWithoutActivation
{
  get { return true; }
}

注意:这两个代码段都来自这个问题:Show a Form without stealing focus?