Синхронизация 2 списков с 1 полосой прокрутки

У меня есть 2 списка рядом друг с другом. В одном хранится заказ, в другом — общая стоимость заказа.

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

Вот что я пробовал

Private Sub lstOrders_Scroll()
    lstTotalsEachOrder.TopIndex = lstOrders.TopIndex
End Sub

Private Sub lstTotalsEachOrder_Scroll()
    lstOrders.TopIndex = lstTotalsEachOrder.TopIndex
End Sub

Любая помощь будет оценена по достоинству.

Я использую Visual Studio 2012, и я кодирую в vb.

Из того, что я прочитал, _Scroll был удален.

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


person IeuanW    schedule 27.05.2015    source источник
comment
Вы можете использовать DataGridView и отображать данные в столбцах - тогда в этом обходном пути нет необходимости.   -  person OneFineDay    schedule 27.05.2015
comment
Если элементы в каждом ListBox связаны друг с другом, вам может быть лучше поместить всю информацию в ListView или DataGridView. Таким образом, они будут прокручиваться вместе, и вам не придется беспокоиться об их синхронизации.   -  person Blackwood    schedule 27.05.2015
comment
@OneFineDay Мне не разрешено использовать используемые таблицы, спасибо за ответ, есть другие варианты?   -  person IeuanW    schedule 27.05.2015
comment
@Blackwood Мне не разрешено использовать базу данных, поэтому я не думаю, что смогу использовать DataGridView, сейчас я посмотрю Listview.   -  person IeuanW    schedule 27.05.2015
comment
@Blackwood, не могли бы вы быстро рассказать о том, как настроить представление списка, добавить и удалить элементы и выбрать последнее добавленное значение   -  person IeuanW    schedule 27.05.2015
comment
@OneFineDay Ну, я управляю 4 списками в 2 формах, 1 форма предназначена для заказа, а другая - краткая форма, где они могут сохранять окна списков в файл.   -  person IeuanW    schedule 27.05.2015
comment
@IeuanWalker: Я думаю, OneFineDay хочет знать, просите ли вы нас помочь вам с домашним заданием.   -  person Blackwood    schedule 27.05.2015
comment
@blackwood о, тогда да   -  person IeuanW    schedule 27.05.2015
comment
@IeuanWalker: Документация MSDN для класса ListView включает пример его использования.   -  person Blackwood    schedule 27.05.2015
comment
@blackwood хорошо, спасибо   -  person IeuanW    schedule 27.05.2015
comment
надеюсь мой ответ не запоздал   -  person вʀaᴎᴅᴏƞ вєнᴎєƞ    schedule 28.05.2015
comment
@BrandonB это не спасибо :)   -  person IeuanW    schedule 28.05.2015


Ответы (1)


Если вы хотите синхронизировать выбранные индексы, вы можете сделать это:

Option Strict On
Option Explicit On

Public Class Form1

    Private Sub ListBox_SelectedIndexChanged(sender As Object, e As EventArgs)
        Dim parentListBox As ListBox = DirectCast(sender, ListBox)
        Dim childListBox As ListBox = DirectCast(parentListBox.Tag, ListBox)

        If parentListBox.SelectedIndex < childListBox.Items.Count Then
            childListBox.SelectedIndex = parentListBox.SelectedIndex
        End If
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        Me.ListBox1.Tag = Me.ListBox2
        Me.ListBox2.Tag = Me.ListBox1
        AddHandler ListBox1.SelectedIndexChanged, AddressOf ListBox_SelectedIndexChanged
        AddHandler ListBox2.SelectedIndexChanged, AddressOf ListBox_SelectedIndexChanged
    End Sub

End Class

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

Option Strict On
Option Explicit On

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        Me.ListBox1.DrawMode = DrawMode.OwnerDrawFixed
        Me.ListBox2.DrawMode = DrawMode.OwnerDrawFixed
        Me.ListBox1.Tag = Me.ListBox2
        Me.ListBox2.Tag = Me.ListBox1
        AddHandler Me.ListBox1.DrawItem, AddressOf ListBox_DrawItem
        AddHandler Me.ListBox2.DrawItem, AddressOf ListBox_DrawItem
    End Sub

    Private Sub ListBox_DrawItem(sender As Object, e As DrawItemEventArgs)
        Dim parentListBox As ListBox = DirectCast(sender, ListBox)
        Dim childListBox As ListBox = DirectCast(parentListBox.Tag, ListBox)
        e.DrawBackground()
        e.DrawFocusRectangle()

        Dim brsh As New SolidBrush(Color.Black)

        If String.Compare(e.State.ToString, DrawItemState.Selected.ToString) > 0 Then brsh.Color = Color.White

        e.Graphics.DrawString(CStr(parentListBox.Items(e.Index)), e.Font, brsh, New RectangleF(e.Bounds.Location, e.Bounds.Size))

        childListBox.TopIndex = parentListBox.TopIndex

    End Sub

End Class

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

person вʀaᴎᴅᴏƞ вєнᴎєƞ    schedule 27.05.2015
comment
Большое спасибо, это работает блестяще: D. Первоначально я использовал этот lstOrders.TopIndex = lstOrders.Items.Count - 1 lstTotalsEachOrder.TopIndex = lstTotalsEachOrder.Items.Count - 1, чтобы отображать последний заказ. Но спасибо, я буду использовать их одновременно - person IeuanW; 28.05.2015
comment
Я использовал ваш второй вариант, кстати :) - person IeuanW; 28.05.2015
comment
вы бы не знали, как скрыть полосу прокрутки в одном списке? - person IeuanW; 28.05.2015
comment
@IeuanWalker - Попробуйте ListBox.ScrollAlwaysVisible = False, но я боюсь, что вы можете не получить ожидаемых результатов. - person вʀaᴎᴅᴏƞ вєнᴎєƞ; 28.05.2015
comment
нет, я пробовал это :/, я хочу, чтобы он был постоянно скрыт. Я искал довольно много сайтов сейчас, и я не думаю, что это возможно. - person IeuanW; 28.05.2015
comment
Я публикую сообщения на своем телефоне, и у меня нет под рукой моей машины Dev. Если это не сработает, то я уверен, что единственный способ удалить полосу прокрутки - это переопределить метод OnPaint и нарисовать весь элемент управления самостоятельно. - person вʀaᴎᴅᴏƞ вєнᴎєƞ; 28.05.2015
comment
Ах, спасибо, я плохо изучил метод onPaint, но боюсь, я недостаточно продвинут, чтобы самому написать метод рисования. - person IeuanW; 28.05.2015
comment
@IeuanWalker - Не сложно, просто куча работы. Обычно такие вещи вообще не нужны. Вы зацикливаетесь на неправильном процессе проектирования. 1-й: заставить все работать на базовом уровне. 2-й: сделать рабочий процесс эффективным. 3-е: сделать так, чтобы это выглядело красиво. Убедитесь, что шаги 1 и 2 выполнены, прежде чем делать что-либо в шаге 3. Если вы этого не сделаете, вы обнаружите, что потратили время на множество вещей. - person вʀaᴎᴅᴏƞ вєнᴎєƞ; 28.05.2015
comment
лол, все работает совершенно нормально, и я только что закончил дизайн, лично мне не нравится внешний вид / или я думаю, что нужны 2 полосы прокрутки :) - person IeuanW; 28.05.2015