2013-03-20 3 views
3

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

У кого-нибудь есть совет?

Вот код, который добавляет элемент в ListBox:

Private Sub bttAddchklstDbManagement_Click(sender As System.Object, e As System.EventArgs) Handles bttAddchklstDBmanagement.Click 
    If Not txtDBManagement.Text = Nothing And Not txtDBManagement.Text = "" Then 
     chklstDBmanagement.Items.Add(txtDBManagement.Text) 
     chklstDBmanagement.SetItemChecked(chklstDBmanagement.Items.Count - 1, True) 
     txtDBManagement.Text = Nothing 
     txtDBManagement.Focus() 
    End If 
End Sub 

txtDBmanagement является TextBox
chklstDbManagement является проверяемой ListBox

ответ

15

Использование TopIndex после добавления элемента.

private void button1_Click(object sender, EventArgs e) 
    { 
     checkedListBox1.Items.Add("item"); 
     checkedListBox1.TopIndex = checkedListBox1.Items.Count - 1; 
    } 
9

откровенно говоря, мне действительно не нравится автопрокрутка, если пользователь не находится внизу списка. , , так вот что я делаю ...

'figure out if the user is scrolled to the bottom already 
    Dim scrolledToBottom As Boolean = False 
    Dim RowsVisible As Integer = lstLog.ClientSize.Height/lstLog.ItemHeight 
    If lstLog.Items.Count < RowsVisible Then scrolledToBottom = True 

    If scrolledToBottom = False Then 
     If lstLog.TopIndex >= lstLog.Items.Count - RowsVisible Then 
      scrolledToBottom = True 
     End If 
    End If 

    'add your item here 
    lstLog.Items.Add(Now.ToString & ": " & s) 

    'now scroll to the bottom ONLY if the user is already scrolled to the bottom 
    If scrolledToBottom Then 
     lstLog.TopIndex = lstLog.Items.Count - 1 
    End If 
1

Основываясь на предложение Майка, я использовал простой & более точный метод:

lstLog.Items.Add(logText) 
    Dim RowsVisible As Integer = lstLog.ClientSize.Height/lstLog.ItemHeight 
    If ActiveControl IsNot lstLog OrElse lstLog.TopIndex >= lstLog.Items.Count - RowsVisible - 1 Then 
     lstLog.TopIndex = lstLog.Items.Count - 1 
    End If 
Смежные вопросы