vb.net - 按列 ("TagIndex = 5"搜索 dgv 列)

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

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

完整的代码行将是:

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

但是这可能吗。

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

dgvDataFLT = dgvData float

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

最佳答案

我建议添加一个类,然后将 DataGridView 控件继承到该类中。我已经做了一个简短的小例子,代码可以工作,但要让它工作,你必须执行几个步骤:

(1) 如果您还没有 Windows 窗体应用程序来测试它,那么, 做一个新的。 (2) 创建名为KeyedDataGridView的类

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

(4) 重建你的项目

(5) 将新组件拖放到您的窗口窗体上。

注意:这个类(class)是有限的,但应该仍然能够做你需要的。

最后,如果您需要任何帮助,请发表评论,我会尽力解决。

    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

https://stackoverflow.com/questions/54249234/

相关文章:

swift - 如何修复此 'required condition is false: format

r - 如何从 Shiny 中的 plotly 事件中获取方面数据

c++ - 如何在嵌入式 V8 中重置全局对象?

amazon-web-services - AWS Glue - 从现有笔记本服务器访问新的开发端点

python-3.x - odoo 从代码向用户发送消息(通知)

d3.js - 如何将 csv 文件加载到 nuxt vue 组件中

ios - 为 App Store 准备不同分辨率的 App Preview 视频

c# - 偷看后从并发队列中删除元素的模式

python - 如何读取 main_file.exe 中的 data.txt 而不将它们保存在 p

bash - 如何以编程方式从 docker-compose.yml 中删除服务?