更改ComboBox的本机行为 - 更改其大小时,将突出显示comboBox

时间:2009-07-29 16:01:01

标签: c#

http://social.msdn.microsoft.com/forums/en-US/winforms/thread/e04e9308-bff5-4fbb-8cd6-0b2cd957aa68/?prof=required

根据另一个论坛,这不是MS问题,因为他们说这是CombBox的“原生”行为。

如果ComboBox有DropDownStyle = DropDown并更改其大小,则文本会突出显示,如果表单有很多ComboBox,则表明控件已被选中。

为了避免这个问题,一个人建议覆盖WndProc。 一切正常,直到只有一个客户报告了未处理的错误

System.ArgumentOutOfRangeException: InvalidArgument=Value of '-2136611475' is not valid for 'start'.
Parameter name: start
   at System.Windows.Forms.ComboBox.Select(Int32 start, Int32 length)
   at System.Windows.Forms.ComboBox.set_SelectionLength(Int32 value)...............


class ComboBoxEx : ComboBox
{
    const int WM_SIZE = 5;

    protected override void WndProc(ref Message m)
    {
        switch(m.Msg)
        {
            case WM_SIZE:
                string text = Text;
                base.WndProc(ref m);

                //The exception strangely is trown here
                SelectionLength = 0;

                Text = text;
                break;

            default:
                base.WndProc(ref m);
                break;
        }
    }
}

我不知道为什么只有一个客户才会发生这种情况。

1 个答案:

答案 0 :(得分:0)

我想不出会引起这种情况的案例,但我有一个解决方法。我检查了反射器中的set_SelectionLength(Int32值):

this.Select(this.SelectionStart, value);

我不是没有为什么SelectionStart突然变成负数,但你可以削减中间人并预先形成这个变通方法代码:

this.Select(0, 0);