【问题标题】:Show autocomplete list after calling TextBox.AppendText()调用 TextBox.AppendText() 后显示自动完成列表
【发布时间】:2019-07-23 10:27:20
【问题描述】:

我在 winforms 对话框(在 .net4.5 上)中有一系列按钮,它们将文本的 sn-ps 附加到名为 FieldDescription 的文本框,如下所示:

private void SnippetButton_Click(object sender, EventArgs e)
{
    var btn = sender as Button;
    FieldDescription.AppendText(btn.Text);
    FieldDescription.Focus();
}

文本框有一个自动完成源,我希望在附加文本后打开自动完成功能。这个想法是让用户可以轻松地用最常用文本的开头字符预先填充文本框。在许多情况下,这意味着他们只需在单击按钮后从自动完成列表中选择一个条目,而无需使用键盘。

有没有办法在像这样以编程方式附加文本后触发自动完成窗口?

【问题讨论】:

    标签: c# .net winforms autocomplete


    【解决方案1】:

    令人惊讶的是,我找不到很好的方法。

    如果您在 .NET 中找不到方法,可以通过 p/invoke 来完成。

    [DllImport("user32.dll", CharSetCharSet = CharSet.Auto, SetLastError = false)]  
    static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, IntPtr wParam, IntPtr lParam);  
    private const int CB_SHOWDROPDOWN = 0x014F;  
    
    SendMessage(FieldDescription.Handle, CB_SHOWDROPDOWN, (IntPtr)1, (IntPtr)0);
    

    您可以将其放入OnFocus 事件中。

    【讨论】:

    • 谢谢 Nibbly,不过我遇到了一点麻烦:我的 TextBox 没有 OnFocus 事件,所以我改用 GotFocus 事件。当我关注文本框时,在附加文本后正确调用它,但未显示自动完成列表。 SendMessage 命令似乎什么也没做。
    • 好吧,伙计,我已经尝试了一切,包括复制控件的部分源代码以尝试显示该框,但绝对没有任何效果。您可以使用SendKeys 来解决它,但自动完成仅在您输入至少一个字母时才会显示。看来我的答案仅适用于 Combobox 自动完成功能,因此您可能会考虑改为 - 您可以重新设置它的样式以使其看起来相似。
    • 谢谢你,我会用 ComboBox 试试。否则,根据我在网上找到的内容,更灵活的解决方案是实现我自己的自动完成列表弹出窗口。这样我就可以准确控制何时显示它,即使它有点矫枉过正。
    猜你喜欢
    • 2012-03-12
    • 1970-01-01
    • 2015-03-20
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多