按列搜索dgv列(“ TagIndex = 5”)

时间:2019-01-18 07:10:55

标签: vb.net

我正在尝试将数据从DGV网格中获取到特定的标签上,到目前为止,它一直运行良好。但是有一次更新移动了DGV中的标签位置,因此Rows(x)不再等于我要将数据移至其中的标签。

是否可以像在Cells("Val")中一样在Rows("")中进行搜索?
实际上,我希望它像这样的Rows("TagIndex = 5")等。

完整的代码行将是:

HopperStatus = dgvDataFlt.Rows("TagIndex = 5").Cells("Val").Value

但这是可能的。

登录时切换12和13行 Row 12 & 13 are switched when logging

dgvDataFLT = dgvData 浮动

If dgvDataFlt.Rows(0).Cells("TagIndex").Value = 12 Then                         
   'DGVDataFlt.AutoResizeColumns()
   '--------------------------------------Floating TAGS fra database------------------------------------------
    ProdRecCnt = dgvDataFlt.Rows(10).Cells("Val").Value  
    ProdTotCnt = dgvDataFlt.Rows(9).Cells("Val").Value   
    FrontFree = dgvDataFlt.Rows(8).Cells("Val").Value    
    CurrAutoMode = dgvDataFlt.Rows(7).Cells("Val").Value  
    PalletStatus = dgvDataFlt.Rows(6).Cells("Val").Value  
    HopperStatus = dgvDataFlt.Rows(5).Cells("Val").Value  
    PowerStatus = dgvDataFlt.Rows(4).Cells("Val").Value   
    CurrRecNo = dgvDataFlt.Rows(3).Cells("Val").Value     
    NomCycTime = dgvDataFlt.Rows(2).Cells("Val").Value    
    AutoStart = dgvDataFlt.Rows(1).Cells("Val").Value    
    MachineNo = dgvDataFlt.Rows(0).Cells("Val").Value    
    LOGTimeStamp = dgvDataFlt.Rows(0).Cells("DateAndTime").Value 'for aktuelle lognings tidstempel
    LOGDateStamp = Microsoft.VisualBasic.Left(LOGTimeStamp, 10) 
    LOGClockStamp = Microsoft.VisualBasic.Mid(LOGTimeStamp, 12, 5)                         
End If

我希望代码看起来/像这样:

If dgvDataFlt.Rows(0).Cells("TagIndex").Value = 12 Then                         
   'DGVDataFlt.AutoResizeColumns()
   '--------------------------------------Floating TAGS fra database------------------------------------------
    ProdRecCnt = dgvDataFlt.Rows("TagIndex = 10").Cells("Val").Value  
    ProdTotCnt = dgvDataFlt.Rows("TagIndex = 9").Cells("Val").Value   
    FrontFree = dgvDataFlt.Rows("TagIndex = 8").Cells("Val").Value    
    CurrAutoMode = dgvDataFlt.Rows("TagIndex = 7").Cells("Val").Value  
    PalletStatus = dgvDataFlt.Rows("TagIndex = 6").Cells("Val").Value  
    HopperStatus = dgvDataFlt.Rows("TagIndex = 5").Cells("Val").Value  
    PowerStatus = dgvDataFlt.Rows("TagIndex = 4").Cells("Val").Value   
    CurrRecNo = dgvDataFlt.Rows("TagIndex = 3").Cells("Val").Value     
    NomCycTime = dgvDataFlt.Rows("TagIndex = 2").Cells("Val").Value    
    AutoStart = dgvDataFlt.Rows("TagIndex = 1").Cells("Val").Value    
    MachineNo = dgvDataFlt.Rows("TagIndex = 0").Cells("Val").Value    
    LOGTimeStamp = dgvDataFlt.Rows(0).Cells("DateAndTime").Value 'for aktuelle lognings tidstempel
    LOGDateStamp = Microsoft.VisualBasic.Left(LOGTimeStamp, 10) 
    LOGClockStamp = Microsoft.VisualBasic.Mid(LOGTimeStamp, 12, 5)
End If

1 个答案:

答案 0 :(得分:0)

我建议添加一个类,然后将DataGridView控件继承到该类中。我已经做了一个简短的示例,并且代码可以正常工作,但是要使其正常工作,您必须执行一些步骤:

(1)如果您还没有Windows窗体应用程序来对此进行测试,      制作一个新的。 (2)创建名为KeyedDataGridView的类

(3)将以下代码复制并粘贴到KeyedDataGridView类中

(4)重建您的项目

(5)将新组件拖放到Windows窗体上。

注意:此类是受限制的,但仍应能够满足您的要求。

最后,如果您需要帮助,请发表评论,并在可能的情况下尝试获取它。

    Option Explicit On

    Public Class KeyedDataGridView
        Inherits Windows.Forms.DataGridView

        Dim _Rows As KeyedDataRows

        Public Shadows Property Rows As KeyedDataRows
            Get
                Return _Rows
            End Get
            Set(value As KeyedDataRows)
                _Rows = value
            End Set
        End Property

        Public Sub New()
            Dim strName As String

            strName = Me.Name

            strName = MyBase.Name

            _Rows = New KeyedDataRows(Me)
            _Rows.Rows = MyBase.Rows
        End Sub

        Protected Overrides Sub Finalize()
            _Rows = Nothing

            MyBase.Finalize()
        End Sub
    End Class


    Public Class KeyedDataRows
        Inherits Windows.Forms.DataGridViewRowCollection

        Dim _TagNames As Dictionary(Of String, Integer)
        Dim _Rows As DataGridViewRowCollection
        Dim _Cells As Dictionary(Of String, DataGridViewCellCollection)
        Dim dgv As DataGridView

        Default Public Overloads ReadOnly Property Item(strTagName As String) As DataGridViewRow
            Get
                Return _Rows.Item(Me.IndexFromName(strTagName))
            End Get
        End Property

        Protected Friend Property Rows As DataGridViewRowCollection
            Get
                Return _Rows
            End Get
            Set(value As DataGridViewRowCollection)
                _Rows = value
            End Set
        End Property



        Public Property TagName(index As Integer) As String
            Get
                Return CStr(_TagNames.Item(index))
            End Get
            Set(value As String)
                _TagNames.Item(index) = value
            End Set
        End Property

        Public Sub New(tmp As DataGridView)
            MyBase.New(tmp)

            dgv = tmp

            _TagNames = New Dictionary(Of String, Integer)
            _Cells = New Dictionary(Of String, DataGridViewCellCollection)
        End Sub

        Public Shadows Sub Add(strTagName As String)
            Dim intCurRow As Integer

            If dgv.AllowUserToAddRows Then
                intCurRow = _Rows.Count - 1
            Else
                intCurRow = _Rows.Count
            End If
            _TagNames.Add(strTagName, intCurRow)
            _Rows.Add()
        End Sub

        Public Shadows Sub Add(strTagName As String, dataGridViewRow As DataGridViewRow)
            Dim intCurRow As Integer

            If dgv.AllowUserToAddRows Then
                intCurRow = _Rows.Count - 1
            Else
                intCurRow = _Rows.Count
            End If
            _TagNames.Add(strTagName, intCurRow)
            _Rows.Add(dataGridViewRow)
        End Sub

        Public Shadows Sub Add(count As Integer, strTagNames() As String)
            Dim intI As Integer
            Dim intCurRow As Integer

            If dgv.AllowUserToAddRows Then
                intCurRow = _Rows.Count - 1
            Else
                intCurRow = _Rows.Count
            End If
            For intI = 0 To (count - 1)
                _TagNames.Add(strTagNames(intI), intCurRow)
                _Rows.Add()

                intCurRow = _Rows.Count - 1
            Next intI
        End Sub

        Public Property IndexFromName(strTagName As String) As Integer

            Get
                If _TagNames.Count > 0 Then
                    If _TagNames.ContainsKey(strTagName) Then
                        Return _TagNames.Item(strTagName)
                    Else
                        Return -1
                    End If
                Else
                    Return -1
                End If
            End Get
            Set(value As Integer)
                _TagNames.Add(strTagName, value)
            End Set
        End Property

        Public Overloads Sub RemoveAt(strTagName As String)
            _Cells.Remove(strTagName)
            _Rows.RemoveAt(IndexFromName(strTagName))
            _TagNames.Remove(strTagName)
        End Sub


        Protected Overrides Sub Finalize()
            _TagNames.Clear()
            _TagNames = Nothing

            _Cells.Clear()
            _Rows.Clear()

            _Cells = Nothing
            _Rows = Nothing

            MyBase.Finalize()
        End Sub
    End Class

我还向Windows窗体中添加了以下按钮来测试代码:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        With KeyedDataGridView1
            .Rows.Add("Tag Test 1")

            .Rows.Add("Tag Test 2")

            .Rows.Add("Tag Test 3")

            .Rows.Add("Tag Test 4")
        End With
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        MsgBox(KeyedDataGridView1.Rows("Tag Test 3").Cells(0).Value & vbCrLf &
               KeyedDataGridView1.Rows("Tag Test 3").Cells(1).Value & vbCrLf &
               KeyedDataGridView1.Rows("Tag Test 3").Cells(2).Value)
        MsgBox(KeyedDataGridView1.Rows("Tag Test 2").Cells(0).Value & vbCrLf &
               KeyedDataGridView1.Rows("Tag Test 2").Cells(1).Value & vbCrLf &
               KeyedDataGridView1.Rows("Tag Test 2").Cells(2).Value)
        MsgBox(KeyedDataGridView1.Rows("Tag Test 1").Cells(0).Value & vbCrLf &
               KeyedDataGridView1.Rows("Tag Test 1").Cells(1).Value & vbCrLf &
               KeyedDataGridView1.Rows("Tag Test 1").Cells(2).Value)

    End Sub