ComboBox的Editbox部分会自动选中

我有一个小问题,一直困扰我几个小时。

在我的WinForms(.NET 3.5)应用程序中,我在运行时在TableLayoutPanel中创建一些ComboBoxes(DropDownStyle = DropDown)并用字符串填充它。 combobox配置为自动resize(Anchor = Left | Right)。

问题是每当调整ComboBox的大小(即调整对话框大小)时,ComboBox的editbox部分将被完全选中/突出显示。 在我看来,这给我想要避免的客户造成了非常混乱的影响。

如果ComboBox具有固定大小,则不会出现此问题。

另请注意,更改DropDownStyle不是一个选项 – 我需要手动输入文本的可能性。

我已经尝试过乱用覆盖OnPaint方法,这种方法并不常用。 我也尝试清除ComboBox.Resize事件中的选择,它在某种程度上起作用,但似乎是一个非常难看的解决方案 – 有很多闪烁,故意选择的文本被取消选择,我将不得不为每个添加事件处理程序和我对话框中的每个ComboBox。

这个问题有更好的解决方案吗?

先感谢您。

此致,安迪

这是一个老问题,但我发现它正在寻找答案并最终实现了我自己的解决方案。 不妨把它贴在这里,对吗?

foreach (var cb in Controls.OfType()) { cb.Resize += (sender, e) => { if (!cb.Focused) cb.SelectionLength = 0; }; } 

故意选择的文本被取消选中

此WinForms错误不会影响选定的ComboBox,因此通过忽略具有Focus的那些,我们会处理丢失当前选择的问题。

我必须在我的对话框中为每个ComboBox添加事件处理程序。

由foreach循环照顾。 如果您不想破坏设计器,或者让设计师破坏它,请将它放在InitializeComponent()或.ctor中。

有很多闪烁

如果我快速resize,我只会看到闪烁,但我在Win7上,所以在XP上可能会有所不同。

哇。 感谢你们!

显然这个bug已经持续了很多年。 我正在使用.Net 4(Visual Studio 2010)构建UserControl。 这是我的bsneeze代码的轻微修改版本。

干杯

 using System.Windows.Forms; using System.Linq; public MyUserControlCtor() { InitializeComponent(); foreach( Control ctrl in Controls) { ComboBox cb = ctrl as ComboBox; if (cb != null) { cb.Resize += (sender, e) => { if (!cb.Focused) this.FCHZ_ComboBox.SelectionLength = 0; }; } } } 

到目前为止,没有一个答案对我有用。 我发现唯一可靠的方法是通过BeginInvoke异步发布消息,在控件上的所有其他活动完成后将SelectionLength设置回零。 闪烁的数量是非常烦人和不专业的,但它是我能想到的最好的……到目前为止。

 internal class FixedComboBox : ComboBox { protected override void OnResize(EventArgs e) { if (IsHandleCreated && !Focused) { BeginInvoke((Action)(() => { SelectionLength = 0; })); } base.OnResize(e); } } 

我发现在resize事件中将combobox的选择长度设置为0,无论combobox处于何种控制状态,都会导致更少的闪烁,而不是在组合本身的大小调整上进行。

我实际上在VB.Net中实现了这一点,但它应该应用于C#。

处理ComboBox的父容器的Resize事件。 把这一行放在那里:

MyComboBox.SelectionLength = 0

一个例子(显然是VB):

 Private Sub MyControl_Resize(sender As Object, e As EventArgs) Handles Me.Resize MyComboBox.SelectionLength = 0 End Sub 

祝你好运!

–BP

这似乎是使用DropDownStyle DropDownComboBox的本机Windows实现中的错误。

此处其他答案中详述的修复(在ComboBoxResize事件中将SelectionLength属性设置为0(零))在大多数情况下运行良好。

但是,我发现,解决这个问题的解决办法并不总是有效。 如果ComboBox位于TableLayoutPanel ,并且该TableLayoutPanel具有多个具有Percent大小类型的列,则该修复通常不起作用。

一张图片胜过千言万语。 请参阅以下用于演示问题的表单的屏幕截图。

在此处输入图像描述