Newsgroup: it.comp.lang.visual-basic
Titolo: TableAdapterManager tipizzato come proprietà di un UserControl

Buongiorno. Sicuramente esiste una soluzione migliore di quella che ho trovato io, ma comunque posto il quesito.
Per sostituire la classe ComboBox predefinita, che ha una serie di limitazioni, fra le quali il fatto che non sia possibile metterla in ReadOnly (non esiste tale proprietà per la classe ComboBox), ho pensato di creare un mia classe myTextBoxExtra, che altro non e' che un UserControl, con un Button e 2 TextBox. Il Button mi servirebbe per aprire un form ad elenco di inserimento, mentre i TextBox1 e' collegato al bingingsource dell'Usercontrol.
Fin qui tutto OK. La mia esigenza e' quella di associare il TextBox2 ad una seconda origine dati, che visualizzi un DisplayMember.
Per generalizzare l'Usercontrol, il TableAdapterManager dovrebbe essere passato come property e obJAdapert aggiornare la objDataSet.DataTable opportuna, che ho selezionato da designer modificando il campo proprieta' myTableAdapterManager. Vedere codice allegato:
 
Public Class myTextBoxExtra
    Dim objDataView As DataView
    Dim objDataSet As New dataDataSet
    Dim objRow As DataRowView
    Dim objAdapter As dataDataSetTableAdapters.LstProvincieTableAdapter
 
    Dim _DataSource As BindingSource
    Public Property myDataSource As BindingSource
        Get
            Return _DataSource
        End Get
        Set(ByVal value As BindingSource)
            _DataSource = value
        End Set
    End Property
 
    Dim _ValueMember As String
    Public Property myValueMember As String
        Get
            Return _ValueMember
        End Get
        Set(ByVal value As String)
            _ValueMember = value
        End Set
    End Property
 
    Dim _DisplayMember As String
    Public Property myDisplayMember As String
        Get
            Return _DisplayMember
        End Get
        Set(ByVal value As String)
            _DisplayMember = value
        End Set
    End Property
 
    Dim _TableAdapterManager As dataDataSetTableAdapters.TableAdapterManager
    Public Property myTableAdapterManager As dataDataSetTableAdapters.TableAdapterManager
        Get
            Return _TableAdapterManager
        End Get
        Set(ByVal value As dataDataSetTableAdapters.TableAdapterManager)
            _TableAdapterManager = value
        End Set
    End Property
 
    Private Sub myTextBoxExtra_BindingContextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.BindingContextChanged
        'Me.MyTextBox2.DataBindings.Add(New Binding("Text", Me.myDataSource, Me.myDisplayMember, Me.DataBindings.Item(0).FormattingEnabled, System.Windows.Forms.DataSourceUpdateMode.OnValidation, Nothing, Me.DataBindings.Item(0).FormatString))
 
    End Sub
 
 
    Private Sub myTextBoxExtra_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'MsgBox(myTableAdapterManager.Container.Components.Item(0).Site)
        MsgBox(MsgBox(Me.myTableAdapterManager.Container.Components.Item(0)))
        If Me.DataBindings.Count > 0 Then
            Me.MyTextBox1.DataBindings.Add(New Binding("Text", Me.DataBindings.Item(0).DataSource, Me.DataBindings.Item(0).BindingMemberInfo.BindingField, Me.DataBindings.Item(0).FormattingEnabled, System.Windows.Forms.DataSourceUpdateMode.OnValidation, Nothing, Me.DataBindings.Item(0).FormatString))
            Me.MyTextBox2.DataBindings.Add(New Binding("Text", Me.myDataSource, Me.myDisplayMember, Me.DataBindings.Item(0).FormattingEnabled, System.Windows.Forms.DataSourceUpdateMode.OnValidation, Nothing, Me.DataBindings.Item(0).FormatString))
        End If
 
    End Sub
 
 
    Private Sub MyTextBox1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyTextBox1.TextChanged
 
        Dim itemFound As Integer = Me.myDataSource.Find(Me.myValueMember, Me.MyTextBox1.Text)
        If itemFound > 0 Then
            objDataView = New DataView(objDataSet.Tables(myDataSource.DataMember))
            objAdapter = New dataDataSetTableAdapters.LstProvincieTableAdapter
 
            objAdapter.Fill(objDataSet.LstProvincie)
            objRow = objDataView.Item(itemFound)
            Me.MyTextBox2.Text = objRow.Item(Me.myDisplayMember)
        Else
            Me.MyTextBox2.Text = ""
        End If
 
 
    End Sub
End Class

 End Class
 
E la domanda...?
 
Bye, G. 
 
 

 
 
Senza contare che si può banalmente impostare in modalità DropDownList, se uno non vuole proprio avere il TextBox editabile...

 E la domanda...?
La domanda e'. E' possibile passare un TableAdapter tipizzato, come proprietà di una istanza di un Usercontrol o in generale di una classe? Trascino il mio UserContol nel Form desiderato, setto le proprieta' myTableAdapterManager, selesionando dall'elenco dei TableAdapter tipizzati quello che voglio usare, per poi nel codice del controllo andare a gestire in modo generico la proprietà, in modo che sia riutilizzabile...
In pratica il mio problema e' che non voglio scrivere qualcosa del genere:
 
objAdapter = New dataDataSetTableAdapters.LstProvincieTableAdapter 
objAdapter.Fill(objDataSet.LstProvincie)
 
perchè e' esplicito, vorrei che .LstProvincieTableAdapter e .LstProvincie fossero settate a livello di proprietà, in modo da cambiarle per ogni istanza del controllo....
 
objAdapter.Fill(objDataSet.LstProvincie) non e' un problema perche' posso scrivere:
objAdapter.Fill(objDataSet.Tables("me.MyDataTable")
dove MyDataTable e' una property, settata a "LstProvincie" in fase di Design.
 
objAdapter = New dataDataSetTableAdapters.LstProvincieTableAdapter
e' lo scoglio perche' non so come passarlo come property.

> Senza contare che si può banalmente impostare in modalità DropDownList, se uno non vuole proprio avere il TextBox editabile...
 
Ma DropDownList non rende non editabile il controllo, impedisce di selezionare qualcosa al di fuori dell'elenco e non e' per niente la stessa cosa..