Visualizzazione dei risultati da 1 a 2 su 2

Discussione: OrigineDati ComboBox

  1. #1

    OrigineDati ComboBox

    HO una form collegata a una tabella dove ho inserito alcune combobox
    Una di queste combobox consente di selezionare un valore, ad esempio il tipo documento.
    Il documento può essere "Documento", "Fattura" o "Ricevuta".
    nel database verrà memorizzato D nel primo caso, F nel secondo e R nel terzo.
    Le combo supportano le proprietà valuemember e displaymember per cui se utilizzassi una tabella "TipoDocumenti" di due colonne (ID, Descrizione) potrei collegare la combo a questa tabella con la proprietà datasource e utilizzare le proprietà valuemember (ID) e displaymember (descrizione) per ottenere l'effetto desiderato (cioè leggere o impostare ad es, Fattura e ottenere la memorizzazione del valore "F" nel campo di origine della combo.

    Ma nel caso in cui non esista una tabella TipoDocumenti perchè fare una tabella per 3 elementi non ha senso, come si può ottenere lo stesso risultato?

    Momentaneamente ho risolto nel seguente allucinante modo:

    --

    su Load la combo viene inizializzata così:
    With Me.DocumentoComboBox
    .Items.Add(New MyList_IdStr("Documento", "D"))
    .Items.Add(New MyList_IdStr("Ricevuta", "R"))
    .Items.Add(New MyList_IdStr("Fattura", "F"))
    End With

    Poi si ha:

    Private Sub RecordCorrente(ByVal sender As Object, ByVal e As EventArgs) Handles DocumentiBindingSource.CurrentChanged
    Dim i As Integer

    For i = 0 To Me.DocumentoComboBox.Items.Count - 1
    If Me.DocumentoComboBox.Items(i).itemdata = Me.TipoDocumentoTextBox.Text Then
    Me.DocumentoComboBox.SelectedIndex = i
    End If
    Next
    End Sub

    Private Sub TipoDocumento_Changed(ByVal sender As Object, ByVal e As EventArgs) Handles DocumentoComboBox.SelectedIndexChanged
    Dim mList As MyList_IdStr
    mList = Me.DocumentoComboBox.Items(Me.DocumentoComboBox.Se lectedIndex)
    Me.TipoDocumentoTextBox.Text = mList.ItemData
    End Sub

    --
    Naturalmente esiste una classe MyList_idstr composto da due stringhe come definito su http://support.microsoft.com/kb/311340 da cui la seconda sub è tratta.

    La cosa funziona (purchè si richiami a mano la sub RecordCorrente nell'evento Form_Load perchè altrimenti la combo al primo record visualizzato non viene valorizzata).
    il controllo TipoDocumentoTextBox fa da collegamento col database perchè la proprietà databinding della combo in questo caso non lavora (o almeno non ci sono riuscito io).

    La sub su change l'avevo originariamente scritta così:

    Private Sub RecordCorrente(ByVal sender As Object, ByVal e As EventArgs) Handles DocumentiBindingSource.CurrentChanged
    Dim stD As String
    stD = ""
    Select Case Me.TipoDocumentoTextBox.Text
    Case "D"
    stD = "Documento"
    Case "F"
    stD = "Fattura"
    Case "R"
    stD = "Ricevuta"
    End Select

    Dim My_Elemento As New MyList_IdStr(stD, Me.TipoDocumentoTextBox.Text)
    Me.DocumentoComboBox.SelectedIndex = Me.DocumentoComboBox.Items.IndexOf(My_Elemento)
    End Sub

    ma la IndexOf non funziona nonostante My_Elemento sia esattamente dello stesso tipo degli items, non ho capito perchè.

    Ciao e grazie
    Davide

  2. #2

    Ve lo dico io...

    Ovviamente, era l'uovo di colombo.
    Colpo d'intuito ed help in linea hanno fatto il miracolo.
    La proprietà DataSource non è una stringa che fa riferimento a una tabella ma è un riferimento diretto a una collection che può essere una tabella, ma può anche essere qualsiasi altra collection.
    Costruire una collection manualmente è estremamente semplice per cui ho risolto con questo solo codice nell'evento LOAD del form:

    Dim MyListCollection As New Collection()
    MyListCollection.Add(New MyList_IdStr("Documento", "D"))
    MyListCollection.Add(New MyList_IdStr("Ricevuta", "R"))
    MyListCollection.Add(New MyList_IdStr("Fattura", "F"))
    Me.DocumentoComboBox.DataSource = MyListCollection
    Me.DocumentoComboBox.DisplayMember = "Name"
    Me.DocumentoComboBox.ValueMember = "ItemData"

    Dove MyList_IdStr è costruito come nel link del messaggio precedente.
    Infine è necessario e sufficiente impostare la proprietà DataBindings SelectedValue sul campo di destinazione della tabella cui la form fa riferimento.

    Per chiunque possa trovarlo utile.

    Saluti
    Davide

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.