2008-11-20 3 views
1

Как получить последний выбранный элемент в .Net Forms multiselect ListBox? Очевидно, если я выберу элемент в списке, а затем выберите другой 10, выбранный элемент будет первым.Как получить последний выбранный элемент в multiselect ListBox?

Я хотел бы получить последний элемент, который я выбрал/снял.

ответ

7

Я бы этот общий подход:

Слушайте событие SelectedIndexChanged и просматривайте каждую коллекцию SelectedIndices.

Сохраните отдельный список всех выбранных индексов, добавляемых, которые еще не были в списке, удалив те, которые были отменены.

Отдельный список будет содержать индексы в хронологическом порядке, выбранном пользователем. Последний элемент всегда является самым последним выбранным индексом.

// for the sake of the example, I defined a single List<int> 
List<int> listBox1_selection = new List<int>(); 

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    TrackSelectionChange((ListBox)sender, listBox1_selection); 
} 

private void TrackSelectionChange(ListBox lb, List<int> selection) 
{ 
    ListBox.SelectedIndexCollection sic = lb.SelectedIndices; 
    foreach (int index in sic) 
     if (!selection.Contains(index)) selection.Add(index); 

    foreach (int index in new List<int>(selection)) 
     if (!sic.Contains(index)) selection.Remove(index); 
} 
+0

Большое спасибо, вы оба были полезны – Germstorm 2008-11-21 07:50:32

5

Не уверен, что понял вопрос, но последний выбранный элемент будет последним в массиве SelectedItems, так что-то, как это должно работать:

ListItem i = list.SelectedItems[list.SelectedItems.Length-1]; 
+1

Это возвращает последний элемент в выбранном списке, который не совпадает с последним выбранным пользователем. Например, если пользователь выбрал «элемент 3», «элемент 1», ваше решение всегда будет возвращать «элемент 3». – 2016-04-05 20:00:52

0

Попробуйте

private void listBox1_MouseUp(object sender, MouseEventArgs e) 
    { 
     int jj = listBox1.IndexFromPoint(e.X, e.Y); 
     object Test = listBox1.Items[jj]; 
     object LatestItemSelected; 
     if(listBox1.SelectedItems.Contains(Test)) 
      LatestItemSelected = Test; 
    } 

Очевидно LatestItemSelected является излишним и там, чтобы подчеркнуть, что вы нашли ваш товар.

4

В случае щелчка мыши использования ListBox следующий код:

private void ListBox1_MouseClick(object sender, MouseEventArgs e) 
{ 
    string s = ListBox1.Items[ListBox1.IndexFromPoint(e.Location)].ToString(); 

    MessageBox.Show(s); 
} 
-1

Это, как я сделал это в VB.

Когда вы обновляете окно списка, вам нужно повторно измерить массив.

Dim SelectedAry(-1) As Integer 

    Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged 
     Dim LastOne As Integer = -1 
     ' First time there no elements in the preserved array 
     If SelectedAry.Length = 0 Then 
       If ListBox1.SelectedIndex <> -1 Then 
        LastOne = 0 
       End If 
     Else 
       'If the SelectedIndices array is larger than the preserved SelectedAry - means that another one had been selected 
       If ListBox1.SelectedIndices.Count >= SelectedAry.Length Then 
        For i = 0 To ListBox1.SelectedIndices.Count - 1 
          'Go through both arrays comparing the values until there is a mismatch 
          'This means that the value in the SelectesIndices is the last one to be added 
          If ListBox1.SelectedIndices(i) <> SelectedAry(i) Then 
           LastOne = i 
           Exit For 
          End If 
        Next 
       End If 
     End If 
     ' Copy the Listbox selectedindices array into the SelectedAry which is preserved for the next selected index change 
     ReDim SelectedAry(ListBox1.SelectedIndices.Count) 
     For i = 0 To ListBox1.SelectedIndices.Count - 1 
       SelectedAry(i) = ListBox1.SelectedIndices(i) 
     Next 
     ' Display the last one added 
     If LastOne >= 0 Then 
       Dim FileName As String = txtFolder.Text & "\" & ListBox1.Items(ListBox1.SelectedIndices(LastOne)).ToString 
       Display_File(FileName) 
     Else 
     End If 
    End Sub 
+0

Вопрос задает решение .net, а не решение vb. – 2016-08-23 20:34:21

0

используя немного отражения, чтобы получить значение FocusedIndex, которое является внутренним свойством ListBox вы можете получить последний сфокусированы на предмет.

int lastSelectedIndex = (int)typeof(ListBox).GetProperty("FocusedIndex",BindingFlags.NonPublic|BindingFlags.Instance).GetValue(myListBox,null); 
SelectedItemType mySelectedItem = myListBox.Items[lastSelectedIndex] as SelectedItemType; 
0

Использование FocusManager.GetFocusedElement (ListBox) или Keyboard.FocusedElement вернуть последний элемент, который вы выбрали.

Смежные вопросы