Ладно ... вот вам сложный ответ, который я понял только вчера. Это моя ошибка, хотя я не упомянул одну важную вещь в своем вопросе, потому что я чувствовал, что это не имеет отношения к проблеме под рукой:
Данные в таблице данных не были отсортированы. Следовательно, я установил свойство Sorted списка в true . Позже я понял, что когда отсортированное свойство списка или даже поля со списком установлено в значение true, элемент значения не устанавливается должным образом. Так что если я напишу:
lb.SelectedValue = valuePassedByUser;
он устанавливает какой-то другой элемент в качестве выбранного, а не устанавливает тот, значение которого равно valuePassedByUser. Короче это портит индексы.
Например, если мои исходные данные:
Index ValueMember DisplayMember
1 A Apple
2 M Mango
3 O Orange
4 B Banana
И я установил sorted = true. Тогда элементы списка:
Index ValueMember DisplayMember
1 A Apple
2 B Banana
3 M Mango
4 O Orange
Теперь, если я хочу установить Banana как выбранное, я запускаю команду stmt:
lb.SelectedValue = "B";
Но вместо того, чтобы установить Banana как выбранный, он устанавливает Orange как выбранный. Зачем? Поскольку список не был отсортирован, индекс Banana был бы равен 4. Таким образом, даже если после сортировки индекса Banana равен 2, он устанавливает индекс 4 как выбранный, таким образом, выбирая Orange вместо Banana.
Следовательно, для отсортированного списка я использую следующий код для установки выбранных элементов:
private void SetSelectedBreakType(ListBox lb, string value)
{
for (int i = 0; i < lb.Items.Count; i++)
{
DataRowView dr = lb.Items[i] as DataRowView;
if (dr["value"].ToString() == value)
{
lb.SelectedIndices.Add(i);
break;
}
}
}