ArgumentOutOfRangeException при сортировке DataGridView

Я пытаюсь отсортировать DGV по столбцам с этим кодом:

points.Clear();
foreach ( CalibrationPoint pt in ch.SWCalibration.Points )
    points.Add( pt );
if ( points.Count > 0 )
    this.dgv.Sort( this.dgv.Columns[ 'X' ], ListSortDirection.Ascending );

где points это SortableBindingList привязанный к DGV

Когда я звоню Sort метод, я получаю ArgumentOutOfRangeException: индекс был вне диапазона. Должен быть неотрицательным и меньшим, чем размер коллекции. Имя параметра: индекс

Вот вывод трассировки стека:

System.Collections.ArrayList.get_Item(Int32 index)
System.Windows.Forms.DataGridViewColumnCollection.get_Item(Int32 index)
...

ниже мой вызов функции, с сортировкой, указанной выше, а остальные вызовы функции.

ты знаешь, почему это происходит? я проверил, когда points.Count > 0, dgv.Rows.Count также> 0, т.е. строки добавляются с каждой точкой, добавленной в список

2 ответа

Решение

Странно эта строка компилируется

this.dgv.Sort( this.dgv.Columns[ 'X' ], ListSortDirection.Ascending );

Странно, потому что индексатор DataGridViewColumnCollection принимает 32-разрядное целое число, которое представляет индекс столбца или строку с именем столбца.

Здесь происходит автоматическое преобразование char в int.
Таким образом, ваш код ссылается на столбец с индексом 88 (значение ascii для X) и, конечно, нет столбца с таким высоким индексом.
Чтобы исправить эту ошибку, используйте правильный номер индекса или имя столбца. Например

this.dgv.Sort( this.dgv.Columns["ColumnName"], ListSortDirection.Ascending );

this.dgv.Columns, вероятно, не содержит 'X'. Убедитесь, что вы правильно указали столбец по имени или индексу. См. Свойство столбцов.

Другие вопросы по тегам