Модераторы: diadiavova, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Binding DataGridView и List(Of Class), Отображаются не все элементы коллекции 
V
    Опции темы
thomas
Дата 19.7.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 3
Всего: 65



Приветствую всех.  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:26

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  gui.JPG 89,98 Kb


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
thomas
Дата 19.7.2007, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 3
Всего: 65



Пока получается вот что.
См. картинку

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  testDGV.JPG 57,40 Kb


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
thomas
Дата 21.7.2007, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 3
Всего: 65



Тему пометил как решенную.

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

Нужные "контролы" внутри DataGriedView надо создавать в ручную и прописывать им события.
Более подробная информация на страницах журнала RSDN.RU и продолжение тут.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума VB .NET
diadiavova
  • Прежде чем задать вопрос, воспользуйтесь поиском: возможно Ваш вопрос уже обсуждался и на него был получен ответ.
  • Если такой же вопрос не найден, не стоит задавать свой вопрос в любую тему, создайте новую.
  • Заголовок темы должен отображать ее суть.
  • Содержание поста должно описывать проблему понятно, но в то же время, по возможности, лаконично. Сначала следует описать суть вопроса, потом можно привести пример кода, не вынуждайте других участников угадывать в чем Ваша проблема - телепатов здесь нет.
  • Будьте взаимно вежливы и дружелюбны.
  • При оформлении сообщений используйте форматирование, примеры кода заключайте в теги [CODE=vbnet][/CODE].
  • Также ознакомьтесь с общими правилами, действующими на всем форуме.
  • Если вопрос решен, не забывайте помечать тему решенной(вверху темы есть ссылка). Кроме того, если Вы хотите отблагодарить участников, оказавших помощь в решении, можно повысить им репутацию, в случае, если у Вас менее 100 сообщений в форуме и функция изменения репутации Вам недоступна, можете написать сюда.
  • Общие вопросы по программированию на платформе .NET обсуждаются здесь.
  • Литература по VB .NET обсуждается здесь.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB .NET | Следующая тема »


 




[ Время генерации скрипта: 0.1948 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.