ho un problema con la classe personalizzata DataGridComboBoxColumn.
Funziona benissimo se nella query sql utilizzo una sola tabella, invece dà errore se uso un INNER JOIN!
Codice:
codice:
Imports System.Data.OleDb
Public Class Index
Inherits System.Windows.Forms.Form
Dim DS As DataSet
Dim MyAdapter As OleDbDataAdapter
#Region " Codice generato da Progettazione Windows Form "
'bla bla bla
#End Region
Private Sub Index_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Try
Dim MyConnection As OleDbConnection
MyConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\vs project\Tarcisio\conti.mdb;")
DS = New DataSet
MyAdapter = New OleDbDataAdapter
MyAdapter.SelectCommand = New OleDbCommand("SELECT * FROM [tblGruppo] INNER JOIN [tblSottoGruppo] ON [tblGruppo].[ID] = [tblSottoGruppo].[IDGruppo]", MyConnection)
'MyAdapter.SelectCommand = New OleDbCommand("SELECT * FROM [tblGruppo]", MyConnection)
MyAdapter.Fill(DS, "[tbl]")
DataGrid1.SetDataBinding(DS, "[tbl]")
DataGrid1.DataSource = DS.Tables("[tbl]")
Funzioni()
'MyAdapter.Dispose()
'DS.Dispose()
'MyConnection.Dispose()
'Catch Ex As Exception
'Me.lblIntroduzione.Text = Ex.Message
'End Try
End Sub
Sub Funzioni()
'Dim cm As CurrencyManager
'cm = Me.BindingContext(DataGrid1.DataSource)
'CType(cm.List, DataView).AllowNew = False
'**********************
'DataGrid1.Enabled = False
Dim ts1 As New DataGridTableStyle
ts1.MappingName = "[tbl]"
'ts1.AllowSorting = False
Dim dCol As New DataGridTextBoxColumn
dCol.MappingName = "tblSottoGruppo.Motivazione"
Dim dCol2 As New DataGridComboBoxColumn(New ComboValueChanged(AddressOf MyComboValueChanged))
dCol2.MappingName = "tblGruppo.Motivazione"
dCol2.ColumnComboBox.DisplayMember = dCol2.MappingName
dCol2.ColumnComboBox.DataSource = DS.Tables("[tbl]").Columns("tblGruppo.Motivazione").Table '.DataSet
dCol2.ColumnComboBox.DropDownStyle = ComboBoxStyle.DropDownList
ts1.PreferredRowHeight = (dCol2.ColumnComboBox.Height + 3)
ts1.GridColumnStyles.Add(dCol)
ts1.GridColumnStyles.Add(dCol2)
ts1.DataGrid = DataGrid1
DataGrid1.TableStyles.Clear()
DataGrid1.TableStyles.Add(ts1)
'/*********************
End Sub
Public Sub MyComboValueChanged(ByVal rowChanging As Integer, ByVal newValue As Object)
End Sub
End Class
codice:
Public Class DataGridComboBoxColumn
Inherits DataGridTextBoxColumn
Public WithEvents ColumnComboBox As ComboBox
Private WithEvents _source As CurrencyManager
Private _rowNum As Integer
Private _isEditing As Boolean
Private _valueChanging As ComboValueChanged
Public Shared _RowCount As Integer
'Fields
'Constructors
'Events
'Methods
Shared Sub New()
End Sub
Public Sub New(ByVal valueChanging As ComboValueChanged)
MyBase.New()
_isEditing = False
_RowCount = -1
_valueChanging = valueChanging
ColumnComboBox = New ComboBox
AddHandler ColumnComboBox.Leave, New EventHandler(AddressOf LeaveComboBox)
AddHandler ColumnComboBox.Enter, New EventHandler(AddressOf ComboMadeCurrent)
AddHandler ColumnComboBox.SelectedIndexChanged, New System.EventHandler(AddressOf ComboIndexChanged)
End Sub
Protected Overloads Overrides Sub Edit(ByVal source As CurrencyManager, ByVal rowNum As Integer, ByVal bounds As Rectangle, ByVal readOnly1 As Boolean, ByVal instantText As String, ByVal cellIsVisible As Boolean)
'on very first pass, set this static member to number of items in tables
'check to see if we are on the new row
If (_RowCount = -(1)) Then
_RowCount = source.Count
End If
If (_RowCount < source.Count) Then
' remove the one that has been added
' and add a new to sync
source.RemoveAt((source.Count - 1))
source.AddNew()
End If
_RowCount = source.Count
MyBase.Edit(source, rowNum, bounds, readOnly1, instantText, cellIsVisible)
_rowNum = rowNum
_source = source
ColumnComboBox.Parent = Me.TextBox.Parent
ColumnComboBox.Location = Me.TextBox.Location
ColumnComboBox.Size = New Size(Me.TextBox.Size.Width, ColumnComboBox.Size.Height)
RemoveHandler ColumnComboBox.SelectedIndexChanged, New System.EventHandler(AddressOf ComboIndexChanged)
ColumnComboBox.Text = Me.TextBox.Text
AddHandler ColumnComboBox.SelectedIndexChanged, New System.EventHandler(AddressOf ComboIndexChanged)
Me.TextBox.Visible = False
ColumnComboBox.Visible = True
ColumnComboBox.BringToFront()
ColumnComboBox.Focus()
End Sub
Protected Overloads Overrides Function Commit(ByVal dataSource As CurrencyManager, ByVal rowNum As Integer) As Boolean
If _isEditing Then
_isEditing = False
SetColumnValueAtRow(dataSource, rowNum, ColumnComboBox.Text)
End If
Return True
End Function
Private Sub ComboIndexChanged(ByVal sender As Object, ByVal e As EventArgs)
_valueChanging(_rowNum, ColumnComboBox.Text)
End Sub
Private Sub ComboMadeCurrent(ByVal sender As Object, ByVal e As EventArgs)
_isEditing = True
End Sub
Private Sub LeaveComboBox(ByVal sender As Object, ByVal e As EventArgs)
If _isEditing Then
SetColumnValueAtRow(_source, _rowNum, ColumnComboBox.Text)
_isEditing = False
Invalidate()
End If
ColumnComboBox.Hide()
End Sub
End Class
Public Delegate Sub ComboValueChanged(ByVal changingRow As Integer, ByVal newValue As Object)
è un po' lunghetto il codice, però non saprei dove mettere mani per risolvere l'errore. Quando provo a selezionare la colonna ComboBox mi viene:
codice:
Eccezione non gestita di tipo "System.ArgumentException" in system.windows.forms.dll
Informazioni aggiuntive: Impossibile creare un elenco di elementi figlio per il campo tblGruppo.
SULLA RIGA:
ColumnComboBox.Parent = Me.TextBox.Parent
grazie!