可以通过名称引用添加到DataGridView控件的新行的列吗?

时间:2019-06-20 20:16:07

标签: visual-studio winforms datagridview

我正在Visual Studio 2008中创建Windows Forms 2.0应用程序。该表单具有DataGridView控件,该控件将通过重载Add(ByVal ParamArray Values())以编程方式向其添加行,如下所示:

dgv.Rows.Add (var1, var2, var3, varEtc)

有没有一种方法可以通过名称来引用单元格 而不是依靠它们的 order ..

dgv将具有许多列,并且在我开发应用程序时按顺序引用它们会造成混淆。通过某些名称或索引字符串来引用它们会容易得多。

不幸的是,DataGridView类太多了,我不知道该朝哪个方向前进。我有一个半熟的想法,首先创建每个行对象,对其进行配置,然后将其添加到集合中,如下所示:

Dim dgvr as DataGridViewRow = New DataGridViewRow
...more code needed...
dgvr.SomeProp.ID    = var1
dgvr.SomeProp.NameF = var2
dgvr.SomeProp.NameL = var3
dgvr.SomeProp.Etc   = varEtc
dgv.Rows.Add (dgvr)

我确信这不是唯一的方法,甚至不是功能性方法。我可以做这项工作吗?还有什么其他方法.. 有什么更好的方法了。.

1 个答案:

答案 0 :(得分:0)

Mick发表的评论中的link 我的OP使我踏上了希望的道路-事实证明,这比我最初设想的要走了几步。

我最终得到的是DataGridViewRow的类扩展。它添加了一个新的扩展函数GetCellByColumnCaption,该扩展函数正是这样做的:它返回一个DataGridViewCell对象,该对象与DataGridView控件中单元格列的标题相对应。

通过这种方式可以避免控件名称出现问题。现在,我可以简单地通过它们具有的最可见的标识符来引用新行中的单元格:列标题文本。

这是一个可行的例子...

Public Class Form1

    Private Sub Form1_Load( _
                        ByVal sender As Object, _
                        ByVal e As System.EventArgs _
                        ) _
                        Handles Me.Load

        'Remove the new blank row.
        dgv.AllowUserToAddRows = False

    End Sub

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

        Dim newRowIdx As Integer = dgv.Rows.Add()
        Dim newRowObj As DataGridViewRow = dgv.Rows.Item(newRowIdx)
        newRowObj.GetCellByColumnCaption("ID").Value = "123"
        newRowObj.GetCellByColumnCaption("Name").Value = "Bob"
        newRowObj.GetCellByColumnCaption("Etc").Value = "Red"

    End Sub

End Class

Module ClassExtensions
    'Note: The Extension() attribute requires .Net 3.5 or above. 
    <System.Runtime.CompilerServices.Extension()> _
    Friend Function GetCellByColumnCaption( _
                        ByVal dgvr As DataGridViewRow, _
                        ByVal colCaption As String _
                        ) _
                        As DataGridViewCell

        For Each cell As DataGridViewCell In dgvr.Cells
            Dim hdrText = LCase(cell.OwningColumn.HeaderText)
            colCaption = LCase(colCaption)
            If hdrText = colCaption Then
                GetCellByColumnCaption = cell
                Exit Function
            End If
        Next
        GetCellByColumnCaption = Nothing
    End Function

End Module