Как создать мои собственные столбцы с DataGridView.AutoGenerateColumns = False - PullRequest
0 голосов
/ 30 ноября 2018

Использование Windows Forms.Следующий пример из DataGridView.AutoGenerateColumns Свойство .Я пытаюсь выяснить, как добавить пользовательские столбцы с AutoGenerateColumns = False.

Private Sub Form_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    SetBinding3()
End Sub 

Private Class Employee
    Public Property Name() As String
        Get
            Return _Name
        End Get
        Set(ByVal value As String)
            _Name = value
        End Set
    End Property
    Private _Name As String
End Class

Private employees As New List(Of Employee)
Dim bs As New BindingSource
Private Sub SetBinding3()
    employees.Add(New Employee With {.Name = "Henry"})
    employees.Add(New Employee With {.Name = "Mary"})

    dgBilling.AutoGenerateColumns = False
    bs.DataSource = employees
    dgBilling.DataSource = bs

    Dim col2 As New DataGridViewTextBoxColumn
    col2.HeaderText = "Name"
    col2.Name = "Name"
    col2.ValueType = GetType(String)
    col2.DataPropertyName = "Name"
    col2.Width = 500
    col2.DefaultCellStyle.ForeColor = Color.Black
    col2.DefaultCellStyle.BackColor = Color.Beige
    dgBilling.Columns.Add(col2)

    dgBilling.Refresh()
End Sub 

Кажется, все работает нормально, за исключением того, что я не вижу данных в DataGridView.Если я нажму на него, имена станут выделенными и видимыми.Но если я не выберу, то это не видно.Я попытался установить ForeColor и BackColor безрезультатно.Как правильно добавить столбец с AutoGenerateColumns = False?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Оказывается, у меня была ошибка в обработчике RowPrePaint.Он ссылался на столбец, который не существовал.В результате ошибки строки не отображались.

Private Sub dgv_RowPrePaint(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowPrePaintEventArgs) Handles dgv.RowPrePaint
    dgv.Rows(e.RowIndex).DefaultCellStyle.BackColor = dgv.Rows(e.RowIndex).Cells("RowColor").Value
End Sub

Как только я исправил ошибку, все показало нормально!

0 голосов
/ 30 ноября 2018

Возможно, есть более простой способ, но я добился успеха с этим.Обратите внимание, что у меня есть пользовательские классы, привязанные к DataGridView с List (Of T), а не BindingSource.Строка columns представляет собой пару имени свойства объекта и текста заголовка столбца.то есть «Имя» равно Product.Name, а «№ продукта» - это то, что показано в заголовке столбца DataGridView.

    dgvItemList.AutoGenerateColumns = False
    dgvItemList.DataSource = Services.MasterLists.Products.GetList

    Dim columns As String() = {"ID", "ID",
                               "Name", "Product #",
                               "Description", "Description",
                               "Family", "Family",
                               "Comments", "Comments"}

    Helpers.Controls.AddColumnsToDataGridView(dgvItemList, columns)

    dgvItemList.Columns(0).Visible = False
    dgvItemList.Columns(1).Width = 90
    dgvItemList.Columns(2).Width = 200
    dgvItemList.Columns(3).Width = 100
    dgvItemList.Columns(4).Width = 200

И определение Helpers.Controls.AddColumnsToDataGridView:

Public Shared Sub AddColumnsToDataGridView(ByRef dgv As DataGridView, ByVal columns As String())

    dgv.Columns.Clear()
    For i As Integer = 0 To columns.Length - 1 Step 2

        Dim column As DataGridViewColumn = New DataGridViewTextBoxColumn()

        ' i = index of the object's property name. i + 1 = the column name to show in the grid
        column.DataPropertyName = columns(i)
        column.Name = columns(i + 1)
        dgv.Columns.Add(column)

    Next

End Sub

Причина, по которой я это делаю, заключается в том, что я не хочу, чтобы DataGridView отображал все свойства объекта Product, только те поля, которые я хочу показать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...