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

Vb.net 按列搜索dgv(“TagIndex=5”),vb.net,Vb.net,我正在尝试将数据从DGV网格获取到特定的标记上,到目前为止,它工作得非常好。但是更新移动了DGV中的标记位置,因此行(x)不再等于我将数据移动到的标记 是否可以像我在单元格(“Val”)中所做的那样进行搜索,而是在行(“”中进行搜索? 实际上,我希望它是这样的行(“TagIndex=5”)等等 完整的代码行将是: HopperStatus = dgvDataFlt.Rows("TagIndex = 5").Cells("Val").Value 但这是可能的 记录时切换第12行和第13行 dg

我正在尝试将数据从DGV网格获取到特定的标记上,到目前为止,它工作得非常好。但是更新移动了DGV中的标记位置,因此
行(x)
不再等于我将数据移动到的标记

是否可以像我在
单元格(“Val”)
中所做的那样进行搜索,而是在
行(“”
中进行搜索?
实际上,我希望它是这样的
行(“TagIndex=5”)
等等

完整的代码行将是:

HopperStatus = dgvDataFlt.Rows("TagIndex = 5").Cells("Val").Value
但这是可能的

记录时切换第12行和第13行

dgvDataFLT=dgvDataFloating

我希望代码的外观/工作方式如下:

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

我建议添加一个类,然后将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

我不知道你说的“标签”是什么意思。对不起,我已经习惯于PLC编程了。我所说的标签是指定义的整数,如ProdRecCnt和HopperStatus等。可能重复您使用数据填充DataGridView的方式?谢谢您的回答,但到目前为止,我已经从零开始以正确的顺序显示日志。如果我再次遇到这个问题,我会试试你的例子:)
    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