ComboBox.SelectionLength = 0 создает исключение InvalidArgument - PullRequest
0 голосов
/ 01 февраля 2012

Для 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 используется для аргумента начала и альта, у нас есть показ InvalidExceptionArgument выше.

Это в отладочном коде. Стиль DropDownStyle, все остальное выглядит непримечательным, но в отладчике я вижу, что свойство SelectionStart равно -1470366488.

Этот код существует уже несколько лет, и сегодня я впервые столкнулся с этим исключением при тестировании отладочной сборки. Я выбираю элемент, который нужно отобразить со строкой SelectedIndex = 2, затем получаю исключение при настройке SelectionLength Есть объяснения?

Ответы [ 3 ]

2 голосов
/ 01 февраля 2012

Из исключения и стека вызовов похоже, что самое простое решение было бы вставить:

viewFormatComboBox.SelectionStart = 0;

до

viewFormatComboBox.SelectionLength = 0;

, чтобы убедиться, что оно имеет допустимое значение.

1 голос
/ 07 февраля 2013

В случае с полем со списком DropDownList элемент управления со списком на самом деле не имеет сущности «Текст».Поэтому установка SelectionStart или SelectionLength этого объекта приводит к непредсказуемым результатам, как упоминалось выше.Как упоминалось в других постах ( Странное поведение, вызванное использованием свойств .Net ComboBox SelectionStart & SelectionLength в режиме «DropDownList» , http://social.msdn.microsoft.com/forums/en-us/csharpgeneral/thread/80B562C9-981E-48E6-8737-727CE5553CBB), также предлагается не использовать эти свойства, я понимаю, почему,Но тестирование этого стиля и отсутствие установки начального значения устранило нашу проблему.

Если не Me.DropDownStyle.Equals (Windows.Forms.ComboBoxStyle.DropDownList), то Me.SelectionStart = Me.Text.Length End If

Надеюсь, это поможет кому-то в будущем ...

1 голос
/ 01 февраля 2012

Вот объяснение того, что, а не почему.

Сеттер для вызовов SelectionLength:

this.Select(this.SelectionStart, value);

Первая строка проверяет правильность аргумента

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

Asвы указали, ваш SelectionStart в качестве значения -1470366488.Вопрос почему?Получатель для вызовов SelectionStart:

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.Согласно документам , должно возвращаться:

Получает начальную и конечную позиции символов текущего выделения в элементе управления редактирования поля со списком.

Очевидно, это не так.Возвращается -1470366488.Зачем?Кто знает.Я бы предположил, что CB_GETEDITSEL возвращает ошибку, которая не проверяется, и wParam [0] не определен, и фреймворк просто использует его вслепую.

Возможно, явно задание SelectionStart (который отправляет CB_SETEDITSEL) перед установкой SelectionLength сведет к минимумувероятность того, что это может произойти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...