Winforms 如何在文本框下方显示另一个带有datagridview的表单以过滤网格数据

Winforms 如何在文本框下方显示另一个带有datagridview的表单以过滤网格数据,winforms,datagridview,Winforms,Datagridview,我已经创建了一个usercontrol。它有两个文本框,一个用于描述,另一个用于标识 接下来,我使用datagridview创建了一个表单。此datagridview的数据源是从预定义的usercontrol发送的。它只有两个列ID和描述 现在我想当usercontrol文本框中用于描述的文本发生更改时,带有datagridview的表单显示在文本框的正下方,并显示匹配的数据作为参考。表单应一直显示,直到用户按enter键或离开文本框。显示表单时,用户应能够在usercontrol文本框中键入文

我已经创建了一个usercontrol。它有两个文本框,一个用于描述,另一个用于标识

接下来,我使用datagridview创建了一个表单。此datagridview的数据源是从预定义的usercontrol发送的。它只有两个列ID和描述

现在我想当usercontrol文本框中用于描述的文本发生更改时,带有datagridview的表单显示在文本框的正下方,并显示匹配的数据作为参考。表单应一直显示,直到用户按enter键或离开文本框。显示表单时,用户应能够在usercontrol文本框中键入文本以进行筛选

当用户离开文本框或按enter键时,datagridview id列和descriptions列的选定行中的值应传递给usercontrol


我做得很好,但是当出现带有datagridview的表单时,显示的表单变为活动状态,并且我无法继续在usercontrol的搜索文本框中写入内容。

您可以尝试使用以下扩展方法将表单显示为非活动状态:

public static class FormExtensions
{
    #region Show inactive top-most

    const int  SW_SHOWNOACTIVATE =  4,
                HWND_TOPMOST      = -1;
    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);

    public static void ShowInactiveTopMost(this Form form)
    {
        ShowWindow(form.Handle, SW_SHOWNOACTIVATE);

        SetWindowPos(form.Handle.ToInt32(),
                        HWND_TOPMOST,
                        form.Left,
                        form.Top,
                        form.Width,
                        form.Height,
                        SWP_NOACTIVATE);
    }

    #endregion
}

它必须是一个表单吗?为什么不创建一个包含DataGridView的面板,并将该面板的父级设置为文本框所在的窗体。这样你就不必担心失去焦点,用户将无法再将表单拖到其他地方,这是一个好主意。我试过改变形状的高度,但它被其他重叠的面板消失了。如我所见,如果使用面板而不是表单,我需要在我希望使用此想法的每个表单中创建面板。我希望它被用作我们刚刚发送数据源的组合框,并在需要时用作组件。谢谢你的评论。