Как получить последний выбранный элемент в множественном списке ListBox? - PullRequest
2 голосов
/ 20 ноября 2008

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

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

Ответы [ 7 ]

7 голосов
/ 20 ноября 2008

Я бы взял такой общий подход:

Прослушайте событие 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);
}
5 голосов
/ 20 ноября 2008

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

ListItem i = list.SelectedItems[list.SelectedItems.Length-1];
4 голосов
/ 05 апреля 2012

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

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

    MessageBox.Show(s);
}
0 голосов
/ 14 сентября 2017

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

0 голосов
/ 11 июля 2017

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

int lastSelectedIndex = (int)typeof(ListBox).GetProperty("FocusedIndex",BindingFlags.NonPublic|BindingFlags.Instance).GetValue(myListBox,null);
SelectedItemType mySelectedItem = myListBox.Items[lastSelectedIndex] as SelectedItemType;
0 голосов
/ 23 августа 2016

Я так и сделал в 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 голосов
/ 25 августа 2009

Попробуйте это

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

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