WPF ListBox 值来自另一个选定的 ListBox 项,然后上下移动

Posted

技术标签:

【中文标题】WPF ListBox 值来自另一个选定的 ListBox 项,然后上下移动【英文标题】:WPF ListBox values from another selected ListBox item then move up and down 【发布时间】:2016-04-30 09:34:38 【问题描述】:

我们有一系列列表框——当主列表框中的一个项目被选中时,相关值会显示在子列表框中。这按预期工作......

我们还可以上下移动项目,这可以按预期工作...

当主 ListBox 具有 SelectionChanged 事件时,在子列表框中上下移动项目的能力停止工作。评论一下子列表框中的 out 和 up/down 再次起作用...我一定忽略了一些非常明显的东西,但是经过多次更改后仍然无法正常工作

主列表框选择已更改

 Private Sub Reports_CashFlow_ListBox_IndexChanged(ByVal MainLB As String, ByVal NominalLB As String, ByVal NomDT As DataTable)
    Try
        Dim LB As LBx = ReportCashFlow_Grid.FindName(MainLB)
        If LB.SelectedIndex = -1 Then
            Exit Sub
        End If
        Dim NomLB As LBx = ReportCashFlow_Grid.FindName(NominalLB)
        If NomLB Is Nothing Then
            Exit Sub
        End If
        If LB.SelectedValue Is Nothing Then
            Exit Sub
        End If
        If LB.SelectedValue.GetType.Name Is Nothing Then
            Exit Sub
        End If
        If LB.SelectedValue.GetType.Name <> "DataRowView" Then
            Dim CatID As Integer = LB.SelectedValue

            Dim DV As New DataView(NomDT)
            DV.RowFilter = "CatID = " & CatID & " AND FormID = " & Form_ID
            DV.Sort = "Position"

            With NomLB
                .ItemsSource = DV
                .Items.Refresh()
            End With

            LB.ScrollIntoView(LB.SelectedItem)

        End If
    Catch ex As Exception
        EmailError(ex)
    End Try
End Sub

上移项目

 Private Sub Reports_BalanceSheet_ListBoxMoveUp(LB As ListBox, DT As DataTable, DisplayName As String, Optional MasterListBox As ListBox = Nothing)
    Try
        Dim StartIndex As Integer = LB.SelectedIndex
        If StartIndex = -1 Then
            AppBoxValidation("You have not selected an item to move up!")
            Exit Sub
        End If

        If Not StartIndex = 0 Then
            Dim CatID As Integer = 0
            If DisplayName = "NomName" Then
                CatID = MasterListBox.SelectedValue
            End If
            Dim vSelected As DataRow = DT.Rows(StartIndex)
            Dim vNew As DataRow = DT.NewRow()
            vNew.ItemArray = vSelected.ItemArray
            DT.Rows.Remove(vSelected)
            DT.Rows.InsertAt(vNew, StartIndex - 1)
            DT.AcceptChanges()
            LB.SelectedIndex = StartIndex - 1

            Dim vPos As Integer = 0
            For Each Row As DataRow In DT.Rows
                If Not CatID = 0 Then
                    If Row("CatID") = CatID Then
                        Row("Position") = vPos
                        vPos += 1
                    End If

                Else
                    Row("Position") = vPos
                    vPos += 1
                End If

            Next


            LB.Items.Refresh()
        End If


    Catch ex As Exception
        EmailError(ex)
    End Try
End Sub

【问题讨论】:

【参考方案1】:

原来是与 DataView 中的数据子集相关的问题 - 因此需要在整个后端表中找到所选项目的正确索引和替换索引

 Private Sub Reports_BalanceSheet_ListBoxMoveUp(LB As ListBox, DT As DataTable, DisplayName As String, Optional MasterListBox As ListBox = Nothing)
    Try
        Dim StartIndex As Integer = LB.SelectedIndex
        If StartIndex = -1 Then
            AppBoxValidation("You have not selected an item to move up!")
            Exit Sub
        End If

        If Not StartIndex = 0 Then
            Dim CatID As Integer = 0
            If DisplayName = "NomName" Then
                CatID = MasterListBox.SelectedValue
                'As the view could be a subset of data we need to find the actual back end DB index
                Dim SelectedID As Integer = LB.SelectedValue
                Dim DR() As DataRow = DT.Select("ID = " & SelectedID, Nothing)
                Dim vIndex As Integer = DT.Rows.IndexOf(DR(0))
                Dim vCurrentPos As Integer = DR(0)("Position")
                'Find the index of the one above in the grid
                Dim DR2() As DataRow = DT.Select("CatID = " & CatID & " AND Position = " & vCurrentPos - 1, Nothing)
                Dim vIndex2 As Integer = DT.Rows.IndexOf(DR2(0))
                Dim vSelected As DataRow = DT.Rows(vIndex)
                Dim vNew As DataRow = DT.NewRow()
                vNew.ItemArray = vSelected.ItemArray
                DT.Rows.Remove(vSelected)
                DT.Rows.InsertAt(vNew, vIndex2)
                DT.AcceptChanges()
            Else
                Dim vSelected As DataRow = DT.Rows(StartIndex)
                Dim vNew As DataRow = DT.NewRow()
                vNew.ItemArray = vSelected.ItemArray
                DT.Rows.Remove(vSelected)
                DT.Rows.InsertAt(vNew, StartIndex - 1)
                DT.AcceptChanges()

            End If

            Dim vPos As Integer = 0
            For Each Row As DataRow In DT.Rows
                If Not CatID = 0 Then
                    If Row("CatID") = CatID Then
                        Row("Position") = vPos
                        vPos += 1
                    End If


                Else
                    Row("Position") = vPos
                    vPos += 1
                End If

            Next

            LB.SelectedIndex = StartIndex - 1

        End If


    Catch ex As Exception
        EmailError(ex)
    End Try
End Sub

【讨论】:

以上是关于WPF ListBox 值来自另一个选定的 ListBox 项,然后上下移动的主要内容,如果未能解决你的问题,请参考以下文章

WPF绑定第二个ListBox与第一个ListBox中的选定项目相关

加载 WPF 时在 ListBox 中设置选定项的样式

WPF:将 ListBox ContextMenu 的命令参数绑定到 ListBox 的选定项

wpf中如何绑定到listbox中的选定项

如何在 WPF CheckBox ListBox 中获取选定项目

WPF ListBox - 如何从数据表中输入值?