【问题标题】:ComboBox.SelectionLength = 0 throws InvalidArgument ExceptionComboBox.SelectionLength = 0 抛出 InvalidArgument 异常
【发布时间】:2012-01-31 20:19:52
【问题描述】:

对于 ComboBox,当我设置 SelectionLength = 0 时,出现错误:

InvalidArgument=Value of '-1470366488' is not valid for 'start'.
Parameter name: start
Stack Trace: 
at System.Windows.Forms.ComboBox.Select(Int32 start, Int32 length)
at System.Windows.Forms.ComboBox.set_SelectionLength(Int32 value)
at MyCompany.Odin.WebClient.STComplexView.loadViewFormats()

这不是在Clear() 之后,也不是绑定控件。

这段代码中(不那么)有趣的地方:

//Adding Items to the combo box (6 in total)
// ...
viewFormatComboBox.Items.Add(appResMgr.GetString("STR_6X2_HEXAXIAL"));
viewFormatComboBox.SelectedIndex = 2;
viewFormatComboBox.SelectionLength = 0;   //<<<< The exception is thrown here

在我们的代码中,我们没有指定 SelectionStart,但是当我看到上面包含的代码时,它已经有了 -1470366488 的值。我假设这是在 ComboBox 执行

时使用的
ComboBox.Select(Int32 start, Int32 length) 

调用,通过设置 SelectionLength 触发。我假设 SelectionStart 用于开始参数和 viola,我们在上面显示了 InvalidExceptionArgument。

这是在调试代码中。样式是DropDownStyle,其他一切看起来都没什么特别的,但在调试器中我看到SelectionStart 属性是-1470366488。

这段代码已经存在几年了,今天我在测试调试版本时第一次遇到这个异常。我正在选择我想用 SelectedIndex = 2 行显示的项目,然后在设置 SelectionLength 时出现异常 有什么解释吗?

【问题讨论】:

  • 我认为问题在于您对 Selection 的解释 - 您是要选择组合框中的文本,还是要 Select 一个项目?
  • 嗯。根据例外情况,您为值指定 -1470366488,而不是 0。您显示的代码实际上不包括您设置 SelectedIndex 属性的行,所以我不知道是什么出错了。 SelectionStartSelectedIndex无关;这可能是混乱的根源吗?
  • davisoa - 我正在尝试确保在文本框中没有选择任何文本。
  • Cody - 查看帖子以获取更新,谢谢。
  • davisoa - 我解决了问题中的问题,现在应该更有意义了。谢谢,

标签: c# .net winforms combobox


【解决方案1】:

从异常和调用堆栈看来,最简单的解决方案是插入:

viewFormatComboBox.SelectionStart = 0;

之前

viewFormatComboBox.SelectionLength = 0;

确保它具有有效值。

【讨论】:

  • 这就是我所做的,但我不确定是什么改变了这个问题。
【解决方案2】:

这里是对什么而不是为什么的解释。

SelectionLength 调用的设置器:

this.Select(this.SelectionStart, value);

第一行检查 arg 有效性

 if (start < 0)
      {
        throw new ArgumentOutOfRangeException("start", System.Windows.Forms.SR.GetString("InvalidArgument", (object) "start", (object) start.ToString((IFormatProvider) CultureInfo.CurrentCulture)));
      }

正如您所指出的,您的 SelectionStart 的值为 -1470366488。问题是为什么? SelectionStart 调用的 getter:

int[] wParam = new int[1];
System.Windows.Forms.UnsafeNativeMethods.SendMessage(new HandleRef((object) this, this.Handle), 320, wParam, (int[]) null);
return wParam[0];

消息 320 (0x140) 是 CB_GETEDITSEL。根据docs,应该返回:

获取当前字符的起止位置 在组合框的编辑控件中进行选择。

显然不是。它返回-1470366488。为什么?谁知道。我猜 CB_GETEDITSEL 正在返回一个错误,它没有被检查并且 wParam[0] 是未定义的,框架只是盲目地使用它。

也许在设置 SelectionLength 之前显式设置 SelectionStart(发送一个 CB_SETEDITSEL)将最大限度地减少它发生的机会。

【讨论】:

  • 史蒂文,很好的崩溃 - 更接近解释,谢谢!
【解决方案3】:

对于 DropDownList 的组合框样式,组合框控件实际上没有“文本”框实体。因此,如上所述,设置该对象的 SelectionStart 或 SelectionLength 会产生不可预知的结果。正如其他帖子(Weird behavior caused by using .Net ComboBox properties SelectionStart & SelectionLength in "DropDownList" modehttp://social.msdn.microsoft.com/forums/en-us/csharpgeneral/thread/80B562C9-981E-48E6-8737-727CE5553CBB)中提到的,也建议不要使用这些属性,我明白为什么。但是测试该样式而不设置 Start 值解决了我们的问题。

If Not Me.DropDownStyle.Equals(Windows.Forms.ComboBoxStyle.DropDownList) Then Me.SelectionStart = Me.Text.Length 结束如果

希望这对将来的某人有所帮助...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-14
    • 2011-12-26
    • 2013-05-24
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多