Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB .NET > Binding DataGridView и List(Of Class)


Автор: thomas 19.7.2007, 20:22
Приветствую всех.  smile 

Работаю над программой, которая перегоняет данные из Excel в XML. Входной файл Excel содержит таблицу с адресами. Кол-во и названия столбцов могут быть различными. А вот выходной стандарт XML строго определенный. Есть тестовый вариант, который выглядит так: смотри присоединенный файл.
Там для создания связей между данными из таблицы Excel и "полями" которые могут быть включены в структуру XML я использовал CheckBox'ы и ComboBox'ы, содержащие наименования полей из таблицы Excel.
Но заказчик требует предусмотреть возможность добавления элементов в требуемые для XML данные. Сейчас там 23 варианта. Могут добавиться еще штук несколько. И в моём варианте придется переделывать весь GUI. 
Потому принято решение использовать новые возможности DataGridView, с его разлиными типами ячеек.
В данном случае CheckBox'ы и ComboBox'ы.
В базе данных создана таблица с Code и Discriptions компонентов. Если произойдут изменения, то новые элементы добавляются в таблицу и все. При старте программы она создает коллекцию "элементов" и отображает их в DataGridView. А дальше мы уже выбираем какие колонки и куда относятся и заполняем таблицу и из нее пишем XML. Но это другая история.
Так вот. 
Создал класс, содержащий три поля (code, deckription, fieldlength и 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
            .AutoCheck = True
            .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)
        dgv.DataSource = m_items
    End Sub
End Class


DataGridView создается, отрисовывается, но без CheckBox'ов и ComboBox'ов. Колонки для них есть, а самих элементов нет.

Кто подскажет, где грабли?  smile 
Что я там не так написал?

Автор: thomas 19.7.2007, 20:28
Пока получается вот что.
См. картинку

Автор: thomas 21.7.2007, 10:32
Тему пометил как решенную.

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

Нужные "контролы" внутри DataGriedView надо создавать в ручную и прописывать им события.
Более подробная информация на страницах журнала http://www.rsdn.ru/article/dotnet/DataGridView20.xml и продолжение http://www.rsdn.ru/article/dotnet/DataGridView20part2.xml

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)