Есть класс содержащий три поля (значения беруться из таблицы в БД) и в нем должны быть еще созданы 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
Тут студия начинает очень обильно и многословно на меня ругаться.
Потому обращаюсь к уважаемому сообществу с вопросом,
что я делаю не так? И в чём грабли?
Заранее благодарю.