Discussione chiusa
Visualizzazione dei risultati da 1 a 10 su 10

Discussione: combobox a 2 campi ma salvarne solo uno nel database

  1. #1
    SanzWeb non è in linea Novello
    Post
    23

    combobox a 2 campi ma salvarne solo uno nel database

    Buongiorno a voi tutti del Forum.

    Chiedo una delucidazione per questa mia necessità.

    Nel form di caricamento prodotti, carico una combobox con un indice e il nome di una categoria (l'indice mi serve per caricare a mia volta un altra combobox con le sottocategorie della prima).

    Quando salvo il prodotto finito nel campo categoria mi viene salvato anche l'indice come di seguito:

    1 | Bielle

    perché probabilmente (e forse erroneamente) faccio questa operazione:

    codice:
    cmdinsert.Parameters("@categoria").Value = cbcategoria.Text --> qui prende l'intera riga del combox
    La domanda è quindi la seguente: come faccio a far memorizzare solo la parte destra della combo, quindi solo il valore Bielle?

    spero di aver riportato correttamente il quesito.

    allego anche codice per il caricamento della combobox categorie a campo doppio:

    codice:
    Private Sub caricacategorie()
            Dim Query As String
            Dim ReadCat As MySqlDataReader
            Dim cmdcat As New MySqlCommand
    
            Using myconn As New MySqlConnection(stringaConn)
                myconn.Open()
                Try
                    Query = "SELECT * from  tedakdb.categorie"
                    cmdcat = New MySqlCommand(Query, myconn)
                    ReadCat = cmdcat.ExecuteReader
    
                    While ReadCat.Read
                        Dim indice As Integer = ReadCat.GetInt16("idCategorie")
                        Dim leggicateg = ReadCat.GetString("Categorie")
    
                        cbcategoria.Items.Add(ReadCat("idCategorie") & " | " & ReadCat("categorie"))
                    End While
    
                Catch ex As MySqlException
                    MessageBox.Show(ex.Message)
                End Try
            End Using
        End Sub
    grazie

    Sanzweb

  2. #2
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    257
    Il problema risiede nel fatto che non carichi un campo doppio, ma un campo solo valorizzato con la stringa risultante da te costruita.

    Io opterei per una Structure che descriva il tipo Categoria, ad esempio:
    codice:
        Structure Categoria
            Public Property ID As Int16
            Public Property Nome As String
    
            Public Overrides Function ToString() As String
                Return ID.ToString & " | " & Nome
            End Function
        End Structure
    caricherei la ComboBox con i vari oggetti [Categoria], creati ciclando la tabella e poi sfrutterei la proprietà Nome, accedendovi dopo un cast del [SelectedItem] della ComboBox.

    Un tantino complessa, ma indipendente da come vuoi far apparire la stringa, dato che lo gestisci a parte, con il metodo ToString della Structure.

  3. #3
    SanzWeb non è in linea Novello
    Post
    23
    Ti ringrazio per la soluzione proposta. Quindi una volta costruita la struttura ci si riferisce ai singoli campi con una cosa del tipo: categoria.ID o categoria.nome giusto?

    Diciamo che il discorso di portarmi dietro anche l'ID era per comodità per caricare in un altra combo le sottocategorie di quella categoria scelta nella prima, ma se ci fosse un metodo più snello ne avrei fatto anche a meno di complicarmi la vita.

    Resta il dubbio di come caricare la combo...ovvero come sostituire nel while il discorso della struttura fermo restando la procedura che ho usato caricacategorie()
    Non ho afferrato questa parte.

  4. #4
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    257
    Quote Originariamente inviato da SanzWeb Visualizza il messaggio
    Quindi una volta costruita la struttura ci si riferisce ai singoli campi con una cosa del tipo: categoria.ID o categoria.nome giusto?
    Esattamente. Una volta creato l'oggetto resta più intuitivo l'accesso alle proprietà durante la stesura del codice
    Quote Originariamente inviato da SanzWeb Visualizza il messaggio
    Diciamo che il discorso di portarmi dietro anche l'ID era per comodità per caricare in un altra combo le sottocategorie di quella categoria scelta nella prima, ma se ci fosse un metodo più snello ne avrei fatto anche a meno di complicarmi la vita.
    Qui dipende da come hai impostato le relazioni nel DB. Se la FK è sul campo [Categorie] è palese che dell'ID non te ne faccia niente. Ma la funzione ToString della structure ha proprio l'obiettivo di rendere indipendente quel che visualizzi da quel che poi inserisci nel campo (in questo caso il nome della categoria)
    Quote Originariamente inviato da SanzWeb Visualizza il messaggio
    Resta il dubbio di come caricare la combo...ovvero come sostituire nel while il discorso della struttura fermo restando la procedura che ho usato caricacategorie()
    Non ho afferrato questa parte.
    La collezione [Items] della ComboBox e una lista di Object, quindi ci puoi caricare dentro quel che vuoi. Potresti scrivere un costruttore della Structure che accetti 2 parametri in ingresso, e poi la crei partendo dal record della tabella. Una volta creata la aggiungi alla Collection. Tipo così:
    codice:
    While ReadCat.Read
        Dim indice As Integer = ReadCat.GetInt16("idCategorie")
        Dim leggicateg = ReadCat.GetString("Categorie")
    
        cbcategoria.Items.Add(New Categoria(indice, leggicat))
    End While
    Poi con il SelectedItem della combobox riprendi la proprietà che ti interessa
    codice:
    Dim cat as Categoria = CType(cbcategoria.SelectedItem, Categoria)
    cmdinsert.Parameters("@categoria").Value = cat.Nome

  5. #5
    SanzWeb non è in linea Novello
    Post
    23
    Ti ringrazio per la chiarezza espositiva....vedendo la cosa così sembra quasi di aver costruito una classe e cat.nome e cat.id siano i metodi....

    Scusami ancora, ma la riga cbcategoria.Items.Add(New Categoria(indice, leggicateg)) su indice mi da un errore dicendo che "il numero di argomenti per Public Sub New() è eccessivo.

    Riassumo codice:

    codice:
    Structure Categoria
            Public Property ID As Int16
            Public Property Nome As String
    
            Public Overrides Function ToString() As String
                Return ID.ToString & " | " & Nome
            End Function
        End Structure
        Private Sub caricacategorie()
            Dim Query As String
            Dim ReadCat As MySqlDataReader
            Dim cmdcat As New MySqlCommand
    
            Using myconn As New MySqlConnection(stringaConn)
                myconn.Open()
                Try
                    Query = "SELECT * from  tedakdb.categorie"
                    cmdcat = New MySqlCommand(Query, myconn)
                    ReadCat = cmdcat.ExecuteReader
    
                    While ReadCat.Read
                        Dim indice As Integer = ReadCat.GetInt16("idCategorie")
                        Dim leggicateg = ReadCat.GetString("Categorie")
    
                        cbcategoria.Items.Add(New Categoria(indice, leggicateg))
    
                    End While
    
                Catch ex As MySqlException
                    MessageBox.Show(ex.Message)
                End Try
            End Using
        End Sub
    Ultima modifica di SanzWeb; 06-05-2019 16:16 

  6. #6
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    257
    Classi e Structure sono molto simili. Ti rimando alla guida MSDN per i dettagli, però si, funzionano quasi allp stesso modo.

    Per quanto riguarda l'errore, devi creare tu il costruttore coi parametri in ingresso, altrimenti userà quello di default che è vuoto ed esiste anche se non esplicitato. In alternativa puoi usare il costruttore vuoto e poi usare il With per valorizzare le proprietà.

  7. #7
    SanzWeb non è in linea Novello
    Post
    23
    Sgrubak, abbi pietà, ma non ci salto fuori.

    io ho la riga: cbcategoria.Items.Add(New Categoria(indice, leggicateg)) dove mi da errore in "indice" dicendo che gli argomenti sono sbagliati...

    allora vado nella struttura e faccio questo:

    STRUCTURE categoria (of indice, leggicateg) ---> ma ci mette un Of da solo e poi mi segnala errore in New Categoria...quindi non ho capito se sto trattando il costruttore bene come mi hai detto.

    i parametri dove li devo passare?

    scusami e grazie :-)

  8. #8
    patel45 non è in linea Scolaretto Ultimo blog: recupero dati da pagina html
    Post
    278
    Blogs
    1
    Ma non è più semplice splittare il selecteditem della combo in base al separatore " | " e prendere il secondo valore ?

  9. #9
    SanzWeb non è in linea Novello
    Post
    23
    stavo arrivando alla stessa conclusione, nel senso di intervenire con le funzioni stringa....

    Però poi mi interessava il discorso fatto sulle strutture giusto per imparare una cosa nuova per me...e allora vorrei arrivarci in fondo, risolvendo gli errori che mi sta dando.

    Grazie Patel45 per l'interessamento.

  10. #10
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    257
    Quote Originariamente inviato da patel45 Visualizza il messaggio
    Ma non è più semplice splittare il selecteditem della combo in base al separatore " | " e prendere il secondo valore ?
    Ci ho pensato, ma se poi avesse l'esigenza di modificare la stringa? E se riutilizza questo approccio altrove nel codice? Non so... lo trovo più elegante. (Mero gusto personale )

    Per rispondere a SanzWeb:

    la structure dovrebbe risultare così:
    codice:
    Structure Categoria
    'Le proprietà di prima
        Public Property ID As Int16
        Public Property Nome As String
    'Il costruttore con 2 parametri. Va in overload al costruttore vuoto
        Public  Sub New(id as int16, nome as String)
            ID = id
            Nome = nome
        End Sub
    'L'override della funzione ToString
        Public Overrides Function ToString() As String
            Return ID.ToString & " | " & Nome
        End Function
    End Structure

Discussione chiusa

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi