2014-11-28 4 views
0

Я пытаюсь поставить SelectedIndex в виде выпадающего списка в верхней части отображаемого списка с этим кодом:ListBox TopIndex не работает

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    sourceListBox.SelectionMode = SelectionMode.One; 
    if (textBox1.Text != string.Empty) 
    { 
     int index = sourceListBox.FindString(textBox1.Text); 
     if (index != -1 && sourceListBox.SelectedIndex != index) 
     { 
      sourceListBox.ClearSelected(); 
      sourceListBox.SetSelected(index, true); 
      sourceListBox.TopIndex = sourceListBox.SelectedIndex; 
     } 
    } 
    else 
    { 
     sourceListBox.ClearSelected(); 
    } 
    sourceListBox.SelectionMode = SelectionMode.MultiExtended; 
} 

Но выбранный индекс застрял в нижней части ListBox:

enter image description here

И это только часть кода, которые изменяют поведение ListBox. Как это исправить?

+0

Вы уверены, что другой код не изменит TopIndex? Например, в событии SelectedIndexChanged? – Steve

+0

@Steve событие не связано, я почти уверен, что никакого кода не изменит его –

+0

Я думаю, что у вас есть логическая проблема. Если ваш текущий SelectedIndex равен результату FindString, вы никогда не вводите код, который устанавливает TopIndex. На вашем изображении первый элемент, который соответствует содержимому текстового поля, уже является SelectedIndex, поэтому код не выполняется – Steve

ответ

2

Похоже, что вызов sourceListBox.SelectionMode = SelectionMode.MultiExtended; выполняет сброс TopIndex. Установка на TopIndexпосле, что вызов будет работать:

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    int topIndex = sourceListBox.TopIndex; 

    sourceListBox.SelectionMode = SelectionMode.One; 
    if (textBox1.Text != string.Empty) 
    { 
     int index = sourceListBox.FindString(textBox1.Text); 
     if (index != -1 && sourceListBox.SelectedIndex != index) 
     { 
      sourceListBox.ClearSelected(); 
      sourceListBox.SetSelected(index, true); 
      topIndex = sourceListBox.SelectedIndex; 
     } 
    } 
    else 
    { 
     sourceListBox.ClearSelected(); 
    } 

    sourceListBox.SelectionMode = SelectionMode.MultiExtended; 
    sourceListBox.TopIndex = topIndex; 
} 
+0

Хорошо пятнистый :) –

+0

Правильно .... – Steve

+0

Я не уверен, что это именно так? – petelids

0

Изменить

sourceListBox.TopIndex = sourceListBox.SelectedIndex; 

в

sourceListBox.TopIndex = index; 
+0

Разве это не точная вещь? –

+0

№ Свойство SelectedIndex зависит от SelectionMode.MultiExtended, который вызывается в конце метода. –

+0

Да, но это повлияло на задание, не так ли? –

1

Снимите флажок против surrent SelectedIndex и код, который устанавливает TopIndex будет выполняться всегда, и если ваш текущий SelectedIndex равно результату FindString

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
     ..... 
     int index = sourceListBox.FindString(textBox1.Text); 
     if (index != -1) 
     { 
      sourceListBox.ClearSelected(); 
      sourceListBox.SetSelected(index, true); 
      sourceListBox.TopIndex = sourceListBox.SelectedIndex; 
     } 
     .... 
} 
Смежные вопросы