ComboBox的Editbox部分会自动选中

时间:2009-04-24 14:39:03

标签: c# .net winforms combobox

我有一个小问题,几个小时一直让我烦恼。

在我的WinForms(.NET 3.5)应用程序中,我在运行时在TableLayoutPanel中创建一些ComboBox(DropDownStyle = DropDown)并用字符串填充它。组合框配置为自动调整大小(Anchor = Left | Right)。

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

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

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

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

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

提前谢谢。

此致 安迪

8 个答案:

答案 0 :(得分:13)

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

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

有意选择的文字被取消选择

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

  

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

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

  

有很多闪烁

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

答案 1 :(得分:2)

哇。谢谢你们!

显然这个错误持续了很多年。 我正在使用.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;
            };
        }
    } 
}

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

我发现,对于组合框上的组合框的选择长度设置为0,无论控制组合框处于何种控制状态,都会导致批次减少闪烁而不是在调整大小时执行此操作组合本身。

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

答案 4 :(得分:0)

处理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

答案 5 :(得分:0)

这似乎是ComboBoxDropDownStyle DropDown的原生Windows实施中的错误。

此处其他答案中详述的修补程序(在SelectionLength的{​​{1}}事件中将ComboBox属性设置为0(零))在大多数情况下运行良好。

然而,我发现即使解决这个问题的修复也并不总是有效。如果Resize位于ComboBox中,并且TableLayoutPanel包含多个TableLayoutPanel大小类型的列,则该修复通常不起作用。

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

enter image description here

答案 6 :(得分:0)

为我工作时,namestringn = dataset.Tables(0).Rows(i).Item(11).ToString().Trim namestringn = New String((From c As Char In namestringn() Select c Where Char.IsDigit(c)).ToArray()) 被调用时将selectionLength更改为0。 即使将tableLayoutPanel设置为%也可以使用。

WM_WINDOWPOSCHANGED

答案 7 :(得分:0)

对于 TableLayoutPanel 内的 ComboBox,在 ComboBox.Resize 事件上设置 .SelectionLength = 0 不起作用,但在 TableLayoutPanel.Resize 事件上这样做:

Private Sub TableLayoutPanel_Resize(sender As Object, e As EventArgs)
    Dim curr_panel = TryCast(sender, System.Windows.Forms.TableLayoutPanel)
    For Each curr_combo As ComboBox In curr_panel.Controls.OfType(Of ComboBox)
        If ((Not curr_combo.Focused) And curr_combo.DropDownStyle = ComboBoxStyle.DropDown) Then
                curr_combo.SelectionLength = 0
        End If
    Next
End Sub


dim panel as new TableLayoutPanel with {
    ...
}
AddHandler panel.Resize, AddressOf TableLayoutPanel_Resize