C# 为什么组合框在设置DroppedDown时隐藏光标?

C# 为什么组合框在设置DroppedDown时隐藏光标?,c#,winforms,combobox,C#,Winforms,Combobox,让我们创建WinForms应用程序(我在WindowsVista上运行VisualStudio2008,但从Win98到Vista,在本机或托管代码上,所描述的情况几乎无处不在) 编写这样的代码: using System; using System.Drawing; using System.Windows.Forms; namespace WindowsFormsApplication1 { public class Form1 : Form { priva

让我们创建WinForms应用程序(我在WindowsVista上运行VisualStudio2008,但从Win98到Vista,在本机或托管代码上,所描述的情况几乎无处不在)

编写这样的代码:

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public class Form1 : Form
    {
        private readonly Button button1 = new Button();
        private readonly ComboBox comboBox1 = new ComboBox();
        private readonly TextBox textBox1 = new TextBox();

        public Form1() {
            SuspendLayout();
            textBox1.Location = new Point(21, 51);
            button1.Location = new Point(146, 49);
            button1.Text = "button1";
            button1.Click += button1_Click;
            comboBox1.Items.AddRange(new[] {"1", "2", "3", "4", "5", "6"});
            comboBox1.Location = new Point(21, 93);
            AcceptButton = button1;
            Controls.AddRange(new Control[] {textBox1, comboBox1, button1});
            Text = "Form1";
            ResumeLayout(false);
            PerformLayout();
        }

        private void button1_Click(object sender, EventArgs e) {
            comboBox1.DroppedDown = true;
        }
    }
}
然后,运行应用程序。将鼠标光标放在窗体上,不再触摸鼠标。开始在文本框中键入内容-光标将因此而隐藏。当您按Enter键时,事件抛出,组合框将被下拉。但现在光标不会出现,即使你移动它!并且仅当您单击某个位置时才显示

我找到了关于这个问题的讨论。但是没有好的解决办法


有什么想法吗?:)

首先,这是一组非常模糊的情况,我无法想象这是一个有用的界面操作

这似乎是一个bug,它导致编程下拉菜单在文本框中开始编辑,文本框构成下拉控件的一部分,从而有效地双重隐藏光标。要打破它

我怀疑每个隐藏都存储光标的状态,并在退出时将其恢复

文本框已存储并隐藏了实际光标状态

下拉列表将存储隐藏状态,并将光标设置为隐藏。移动光标时,它可能会将其还原,但会将其还原为已保存的隐藏状态,因此光标仍处于隐藏状态


单击表单似乎会强制重新设置该情况,不确定原因,但这是我的2便士价值。

事实上,我能够通过以下方式解决此问题:

#region Dirty methods :)
#pragma warning disable 169
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);

private const int MOUSEEVENTF_ABSOLUTE = 0x8000;
private const int MOUSEEVENTF_MOVE = 0x1;
private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
private const int MOUSEEVENTF_RIGHTUP = 0x10;
#pragma warning restore 169
#endregion

private void button1_Click(object sender, EventArgs e) {
   Point oldCursorPos = Cursor.Position; // save pos
   Point a = comboBox1.Parent.PointToScreen(comboBox1.Location);
   a.X += comboBox1.Width - 3;
   a.Y += comboBox1.Height - 3;
   Cursor.Position = a;
   // simuate click on drop down button
   mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
   Cursor.Position = oldCursorPos; // restore pos
}
但这不是我想要的解决方案:(
这是一个拐杖,但不是一个解决方案。

我能够像这样解决这个问题:

comboBox1.DroppedDown = true;
Cursor.Current = Cursors.Default;

这是一组奇怪的情况,其中组合框是
DropDownList
类型,您可以在代码中调用组合框上的
DroppedDown
方法,不管它是否有焦点

光标将消失,就像在窗体后面一样。如果单击窗体,光标将返回,但组合框将关闭,因此不是一个好结果

我可以确认此代码在不关闭组合框列表的情况下修复了问题

cbo_VisitorTypes.DroppedDown = true;
Cursor.Current = Cursors.Default;

我在一个Delphi应用程序中遇到了这个问题。正如我建议的那样,我只是在任何下拉事件之后添加了
SendMessage(ComboBox1.Handle,WM_SETCURSOR,0,0)
,然后它就工作了。

是的,我的想法是类似的。但我如何解决这种情况呢?我有一个商业应用程序,其中的文本框中填充了搜索字符串,按钮是“搜索”组合框中充满了搜索结果。所描述的场景是绝对真实的-用户现在正遭受这种情况的折磨!:)我现在尝试模拟鼠标单击下箭头按钮,而不是设置DropedDown,但对我来说这似乎不是一个好的解决方案:(如果搜索填充了组合框,那么使用组合框中的按键事件逐步搜索并填充下拉列表中的大量AJAXified web搜索框如何?即,取消文本框和按钮,并提供更无缝的输出,您可以将搜索返回列表限制为50个项目,以避免下拉列表中出现1000个值或仅显示sear当您有3个或更多字符时,可以使用ch。有很多方法可以改善用户体验。否则,列表框可能是更好的解决方案?这在.NET 4.7.2中仍然是一个问题。此解决方案仍然可以在.NET 4.7.2中恢复光标