Binding DataGridView с List(Of MyClass). Не все отображается

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Binding DataGridView с List(Of MyClass). Не все отображается

Сообщение Thomas » 19.07.2007 (Чт) 22:14

Приветствую всех.
Есть класс содержащий три поля (значения беруться из таблицы в БД) и в нем должны быть еще созданы CheckBox c ComboBox'ом .
Код: Выделить всё

Imports System.Windows.Forms

Public Class AddressComponents
#Region "Variable Declaration."
    Private m_code As Integer
    Private m_codeDescription As String
    Private m_fieldlength As Integer
    Private m_checkBox As CheckBox
    Private m_comboBox As ComboBox
    Private db As AccessToDB
#End Region
#Region "Constructors."
    Public Sub New(ByVal mdb As String, ByVal code As Integer)
        db = New AccessToDB(mdb)
        m_code = code
        GetComponent()
        GetCheckBox()
        GetComboBox()
    End Sub
#End Region
#Region "Methodes."
    Private Sub GetComponent()
        Dim sql As String = "SELECT * FROM components where code =" + m_code.ToString()
        db.FillDataSet("components", sql, True)
        m_codeDescription = db.myDs.Tables("components").Rows(0)("description").ToString()
        m_fieldlength = CInt(db.myDs.Tables("components").Rows(0)("fieldLength"))

    End Sub
    Private Sub GetCheckBox()
        m_checkBox = New CheckBox()
        With m_checkBox
            .Checked = False
            .CheckState = CheckState.Unchecked
            .Name = "ckb" + m_codeDescription.ToString().Trim()
        End With
    End Sub
    Private Sub GetComboBox()
        m_comboBox = New ComboBox()
        With m_comboBox
            .Name = "cbo" + m_codeDescription.ToString().Trim()
        End With
    End Sub
#End Region
#Region "Properties."
    Public Property Code() As Integer
        Get
            Return m_code
        End Get
        Set(ByVal value As Integer)
            m_code = value
        End Set
    End Property
    Public Property CodeDescription() As String
        Get
            Return m_codeDescription
        End Get
        Set(ByVal value As String)
            m_codeDescription = value
        End Set
    End Property
    Public Property FieldLength() As Integer
        Get
            Return m_fieldlength
        End Get
        Set(ByVal value As Integer)
            m_fieldlength = value
        End Set
    End Property
    Public Property myCheckBox() As CheckBox
        Get
            Return m_checkBox
        End Get
        Set(ByVal value As CheckBox)
            m_checkBox = value
        End Set
    End Property
    Public Property myComboBox() As ComboBox
        Get
            Return m_comboBox
        End Get
        Set(ByVal value As ComboBox)
            m_comboBox = value
        End Set
    End Property
#End Region
End Class

Идея в следующем:
при загрузке формы создать коллекцию экземпляров этого класса со значениями из таблицы в БД и загрузить всё это в DataGridView.
Код: Выделить всё

Public Class frmMain
    Private m_items As List(Of AddressComponents) = New List(Of AddressComponents)()
    Private db As AccessToDB 'класс доступа и работы с БД.

    Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ac As AddressComponents 'класс содержащий сомбоБокс, ЧекБокс  и два поля (code, description)
        Dim sql As String = "select code from components"
        db = New AccessToDB("D:\MyProjects\MAIL ID\TestMailing\TestMailing\Mailing.mdb")
        db.FillDataSet("codes", sql, True)
        For Each dr As DataRow In db.myDs.Tables("codes").Rows
            Dim index As Integer = CInt(dr(0))
            ac = New AddressComponents("D:\MyProjects\MAIL ID\TestMailing\TestMailing\Mailing.mdb", index)
            m_items.Add(ac)
        Next

        Dim dgv As DataGridView
        dgv = New DataGridView()
        dgv.Dock = DockStyle.Fill
        dgv.AllowUserToAddRows = False
        Me.Controls.Add(dgv)
        Dim bsour As New BindingSource
        bsour.DataSource = m_items
        dgv.DataSource = bsour
    End Sub
End Class

Всё это стартует, грид отрисовывается, но колонки для боксов создаются пустыми.
Попробовал зайти с другого конца. Сначала создать колонки соответствующих типов, а потом загружать коллекцию
Код: Выделить всё

Public Class frmMain
    Private m_items As List(Of AddressComponents) = New List(Of AddressComponents)()
    Private db As AccessToDB 'класс доступа и работы с БД.

    Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim ac As AddressComponents 'класс содержащий сомбоБокс, ЧекБокс  и два поля (code, description)
        Dim sql As String = "select code from components"
        db = New AccessToDB("D:\MyProjects\MAIL ID\TestMailing\TestMailing\Mailing.mdb")
        db.FillDataSet("codes", sql, True)
        For Each dr As DataRow In db.myDs.Tables("codes").Rows
            Dim index As Integer = CInt(dr(0))
            ac = New AddressComponents("D:\MyProjects\MAIL ID\TestMailing\TestMailing\Mailing.mdb", index)
            m_items.Add(ac)
        Next

        Dim dgv As DataGridView
        dgv = New DataGridView()
        dgv.Dock = DockStyle.Fill
        dgv.AllowUserToAddRows = False
        Me.Controls.Add(dgv)
        With dgv
            .Columns.Add(New DataGridViewCheckBoxColumn())
            .Columns(0).HeaderText = "MyCheckBox"
            .Columns.Add(New DataGridViewTextBoxColumn())
            .Columns(1).HeaderText = "Description"
            .Columns.Add(New DataGridViewComboBoxColumn())
            .Columns(2).HeaderText = "MyComboBox"
            .Columns.Add(New DataGridViewTextBoxColumn())
            .Columns(3).HeaderText = "Code"
            .Columns.Add(New DataGridViewTextBoxColumn())
            .Columns(4).HeaderText = "FieldLength"
            .Rows.Add()
        End With
        For i As Int16 = 0 To m_items.Count - 1
            dgv.Rows.Add(m_items(i))
        Next
    End Sub
End Class

Тут студия начинает очень обильно и многословно на меня ругаться.

Потому обращаюсь к уважаемому сообществу с вопросом,
что я делаю не так? И в чём грабли? :roll:
Заранее благодарю.
Met vriendelijke groetjes
VS2008 Pro FW3.5 SP1

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 21.07.2007 (Сб) 11:45

Приветствую всех.
Вопрос снимается, так как:
заставить грид отобразить коллекцию обьектов содержащую контролы в принципе НЕ ВОЗМОЖНО.

Новый DataGridView позволяет создавать в своих ячейках имитацию полноценных контролов. Их можно содать либо в дизайнере, либо программно. События для этих "контролов" нужно прописывать программно "ручками". Вот такая "Се Ля Ви". 8)
Met vriendelijke groetjes
VS2008 Pro FW3.5 SP1


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 103

    TopList