Можно ли ссылаться на столбцы новой строки, добавляемой в элемент управления DataGridView, по имени ..? - PullRequest
0 голосов
/ 20 июня 2019

Я создаю приложение Windows Forms 2.0 в Visual Studio 2008. Форма имеет элемент управления DataGridView, в который будут добавлены строки, программно добавленные с перегрузкой Add(ByVal ParamArray Values()), как показано:

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

Есть ли способ сослаться на ячейки по имени вместо того, чтобы полагаться на их порядок .. ?

У 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 голосов
/ 21 июня 2019

Ссылка в комментарии Мика к моему оператору заставила меня пойти по пути к тому, на что я надеялся - что оказалось на несколько шагов выше того, что я изначально задумал.

В итоге я получил расширение класса 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...