Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    5

    [vb.net] Id in Combobox

    Salve a tutti

    Ho una domanda da porvi,
    è da un pezzo che non prendo in mano nè vb nè vb.net e sono un po arrugginito..

    Ho creato un programma che legge e scrive dei valori da un db, però mi trovo davanti ad un ostacolo.
    Cerco di spiegarmi:
    Il programma carica una lista di operatori (nomi) e salva le operazioni da loro effettuate.
    La lista di operatori è caricata in una combobox, come potete immaginare ci saranno dei casi di omonimia, nel database non esistono problemi in quanto la chiave primaria è un ID numerico incrementale.
    Esiste un modo per associare la chiave primaria al corrispondente nome nella combo?
    Mi ricordo che una cosa del genere la facevo in php se non erro, quando popolavo una combo.

    Oppure dovrei associare la chiave primaria all'index della combo...
    Non mi combino a uscirne
    La stessa cosa dovrei farla in una checklistbox...

    Potete aiutarmi ad avere alba in questo problema?

    Vi allego parte del codice dove popolo la combo:

    codice:
    Form1.stringasql = "select * from Operatori" 'leggo gli operatori (sarebbe da aggiungere un chk se c'e ancora la persona)         
    Form1.objcomm = New OleDbCommand(Form1.stringasql, Form1.objconn)         
    reader = Form1.objcomm.ExecuteReader          
    While reader.Read() 'finche ci sn operatori li scrivo             
    Oper.Items.Add(reader(1))         
    End While
    Grazie mille

  2. #2
    io proverei con
    Codice PHP:
    ComboBox.Items.Insert(indexvalore
    nel campo index gli metti l'id e nel valore il nome della persona. Se non sbaglio l'index deve essere aggiunto in modo crescente partendo da 0. Cioè tu non puoi scrivere una cosa del tipo
    Codice PHP:
    ComboBox1.Items.Insert(2"pippo"
    se gli index 0 e 1 non esistono.

    Spero possa sia la tua soluzione

  3. #3
    Originariamente inviato da alby_mo
    io proverei con
    Codice PHP:
    ComboBox.Items.Insert(indexvalore
    nel campo index gli metti l'id e nel valore il nome della persona. Se non sbaglio l'index deve essere aggiunto in modo crescente partendo da 0. Cioè tu non puoi scrivere una cosa del tipo
    Codice PHP:
    ComboBox1.Items.Insert(2"pippo"
    se gli index 0 e 1 non esistono.

    Spero possa sia la tua soluzione
    Questa discussione interessa anche me.
    In vb6 si faceva tranquillamente:
    Cmb.ItemData(Cmb.NewIndex) = rsTab("ID")

    rsTab("ID") è un campo contatore del db

    Ho appena provato in vb.net ed effettivamente è come dici tu ci devono essere tutti gli index partendo da 0.

    Io avevo risolto mettendo nella items.add anche l'id della tabella spazio nome cliente, poi quando si seleziona un cliente della combo, il programma legge i caratteri prima dello spazio che per "magia" sono l'id del cliente.
    Soluzione "rudimentale" ma funziona.

    Certo mi piacerebbe fare come per vb6
    Sviluppo per passione

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    5
    Purtroppo la soluzione non è possibile,
    Devo pensare al fatto che esiste la possibilità che un operatore non ci sia più, lo devo lasciare nel DB per tenere comunque traccia di tutte le operazioni effettuate da quell'operatore...
    A questo punto l'unica cosa è scrivere l'id nella combo e selezionare solamente l'id prima del nome...
    Però non mi pare una soluzione "elegante"...
    Non ci credo che non si può fare, questa cosa fa ardere un fuoco dentro maligno

  5. #5
    Originariamente inviato da kiku914
    Purtroppo la soluzione non è possibile,
    Devo pensare al fatto che esiste la possibilità che un operatore non ci sia più, lo devo lasciare nel DB per tenere comunque traccia di tutte le operazioni effettuate da quell'operatore...
    A questo punto l'unica cosa è scrivere l'id nella combo e selezionare solamente l'id prima del nome...
    Però non mi pare una soluzione "elegante"...
    Non ci credo che non si può fare, questa cosa fa ardere un fuoco dentro maligno
    Non ho ben capito cosa vuoi dire.
    La soluzione non è elegante, questo è vero.
    Comunque è quello che volevo dire e che ho fatto io.
    davanti al nome ho messo l'id
    Sviluppo per passione

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    5
    Originariamente inviato da pedro8a
    Non ho ben capito cosa vuoi dire.
    La soluzione non è elegante, questo è vero.
    Comunque è quello che volevo dire e che ho fatto io.
    davanti al nome ho messo l'id
    Scusami, parlavo della prima soluzione proposta,non della tua
    A questo punto e' l'unica cosa che mi rimane da fare, non ho altre soluzioni
    Mi informo in giro comunque se c'e un modo per farlo, portero' google a livelli piu profondi di ricerca...
    Mi pare una limitazione troppo banale...

  7. #7
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Io consiglierei caldamente di dimenticarsi di VB6.0, e studiarsi invece la guida di VB.NET, altrimenti si rischia di usare un linguaggio nuovo usando accrocchi insensati basati su metodi vecchi ed allora tanto valeva restare in VB6.0.

    Nel caso specifico, giusto per fare un esempio e a mo' di paragone:
    - l'item del combobox in VB6.0 era di tipo String
    - in .NET un Item del combobox è di tipo Object

    Ciò vuol dire che ci puoi mettere dentro di tutto, anche crearti un combobox con più colonne, leggi questa discussione:

    http://www.visual-basic.it/view.asp?mid=59853&f=2

    Dopo aver letto, e testato in pratica, quanto suggerito, dovresti anche riflettere sull'uso che deve avere il ComboBox, ovvero, se il combobox in questione deve servire a mo' di ricerca per selezionare un dato nominativo è davvero inutile mostrare l'ID perchè sfido qualsiasi utente a riuscire a distinguere due nominativi uguali (se non tre o più) in base ad un numero, perchè ciò presuppone (erroneamente) che l'utente conosca tutti gli ID a memoria!
    Se così fosse, non servirebbe nemmeno elencarli.

    Si dovrebbero invece mostrare dei dati più significativi, che so il "reparto", oppure la "divisione", oppure "l'ufficio" di appartenza, o altro (questo lo puoi sapere solo tu) che consentano mnemonicamente all'utente di fare la scelta corretta.

    Inoltre fare una query select * from Operatori è sconsigliato perchè si caricano dati inutilmente che non servono.
    Sarebbe come consegnare 1 pizza usando un camion, quando basta un motorino.

    La select dovrebbe quindi essere 'mirata' a caricare solo i campi che 'realmente' servono alla gestione degli stessi imputata al ComboBox, ad esempio

    SELECT Cognome, Nome, Reparto, ID FROM operatori WHERE Attivo=1

    L'ID non serve mostrarlo, vedi la guida sulle proprietà
    DisplayMember, ValueMember e SelectedValue


    Riguardo al metodo Insert , e suggerirei di leggere la guida che recita così:
    Se la proprietà Sorted del controllo ComboBox è true, il parametro index verrà ignorato.
    quindi come si può intuire facilemente l'Insert non c'entra nulla con l'ID...



  8. #8
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    5
    Originariamente inviato da gibra
    Io consiglierei caldamente di dimenticarsi di VB6.0, e studiarsi invece la guida di VB.NET, altrimenti si rischia di usare un linguaggio nuovo usando accrocchi insensati basati su metodi vecchi ed allora tanto valeva restare in VB6.0.

    Nel caso specifico, giusto per fare un esempio e a mo' di paragone:
    - l'item del combobox in VB6.0 era di tipo String
    - in .NET un Item del combobox è di tipo Object

    Ciò vuol dire che ci puoi mettere dentro di tutto, anche crearti un combobox con più colonne, leggi questa discussione:

    http://www.visual-basic.it/view.asp?mid=59853&f=2
    Queste informazioni mi saranno utili, ora leggo la discussione!

    Dopo aver letto, e testato in pratica, quanto suggerito, dovresti anche riflettere sull'uso che deve avere il ComboBox, ovvero, se il combobox in questione deve servire a mo' di ricerca per selezionare un dato nominativo è davvero inutile mostrare l'ID perchè sfido qualsiasi utente a riuscire a distinguere due nominativi uguali (se non tre o più) in base ad un numero, perchè ciò presuppone (erroneamente) che l'utente conosca tutti gli ID a memoria!
    Se così fosse, non servirebbe nemmeno elencarli.

    Si dovrebbero invece mostrare dei dati più significativi, che so il "reparto", oppure la "divisione", oppure "l'ufficio" di appartenza, o altro (questo lo puoi sapere solo tu) che consentano mnemonicamente all'utente di fare la scelta corretta.
    Infatti far vedere l'ID era solamente necessario a me per poter salvare nel db le informazioni.
    Mi spiego:
    Immagina che oggi esistano tre reparti A,B e C.
    Domani il reparto A viene chiuso e se ne crea uno con lo stesso nome quindi di nuovo A.
    Io devo salvare ciò che è stato fatto dal "Vecchio" A utilizzando il suo ID in modo da non confonderlo con il "Nuovo" A
    (E qui sorge spontanea la domanda: 'Quando visualizzi le informazioni di A come fai a distinguerlo dal vecchio?' ma questo è un altro discorso)

    Inoltre fare una query select * from Operatori è sconsigliato perchè si caricano dati inutilmente che non servono.
    Sarebbe come consegnare 1 pizza usando un camion, quando basta un motorino.

    La select dovrebbe quindi essere 'mirata' a caricare solo i campi che 'realmente' servono alla gestione degli stessi imputata al ComboBox, ad esempio

    SELECT Cognome, Nome, Reparto, ID FROM operatori WHERE Attivo=1
    Corretto. Il database contiene solamente Nome, Id e 'attivo' per questo ho utilizzato *.
    Ovviamente nel caso in cui venga allargata la tabella andrò a selezionare informazioni a me inutili...

    L'ID non serve mostrarlo, vedi la guida sulle proprietà
    DisplayMember, ValueMember e SelectedValue


    Riguardo al metodo Insert , e suggerirei di leggere la guida che recita così:
    Se la proprietà Sorted del controllo ComboBox è true, il parametro index verrà ignorato.
    quindi come si può intuire facilemente l'Insert non c'entra nulla con l'ID...


    Si. Il problema è che l'ID della scelta selezionata (che quindi è relativo alle scelte presenti nella combo) è quasi sicuramente diversa dal ID che io mi trovo nel DB.
    Forse ho fatto un casino nel capire di quale ID si sta parlando.

    'Sorted' me li ordina in modo alfabetico crescente, ero interessato mantenerli nell'ordine creato nel DB perchè c'è una sorta di 'divisione virtuale'.
    Diciamo che all'inizio si trovano tutte le opzioni del tipo 1, poi del tipo 2 etc etc...
    E' più una comodità che una necessità, posso ovviare anteponendo un 1-,2- prima del nome reale.
    In questo modo utilizzando Sorted mi appaiono ordinate e comunque divise per tipologia.

    Questa idea mi è balzata in mente adesso, penso che la userò

    Grazie mille per le informazioni

  9. #9
    Utente di HTML.it
    Registrato dal
    May 2011
    Messaggi
    5
    Ho risolto utilizzando dataset!

    codice:
            
    Oper.DataSource = dataset.Tables(0)         
    Oper.ValueMember = dataset.Tables(0).Columns(0).ColumnName         
    Oper.DisplayMember = dataset.Tables(0).Columns(1).ColumnName
    Cosi' riesco a reperire le informazioni perfettamente

    Non riesco pero' a fare la stessa cosa utilizzando la checkedlistbox
    Moriro' davanti a questo programma...

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.