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
DropDown
的ComboBox
的本机Windows实现中的错误。
此处其他答案中详述的修复(在ComboBox
的Resize
事件中将SelectionLength
属性设置为0(零))在大多数情况下运行良好。
但是,我发现,解决这个问题的解决办法并不总是有效。 如果ComboBox
位于TableLayoutPanel
,并且该TableLayoutPanel
具有多个具有Percent
大小类型的列,则该修复通常不起作用。
一张图片胜过千言万语。 请参阅以下用于演示问题的表单的屏幕截图。