View Full Version : [Visual Basic 2008] Combobox & database...
Ciao a tutti...
Sto cercando di creare un assemblatore virtuale di pc (tipo quello che c'è sul sito di gigapc, per intenderci..) in visual basic...
Ora ho creato un form in cui l'utente può scegliere un processore tra quelli presenti sul database... E ho inserito un combobox in cui dovrebbe uscire la lista dei processori (anche dopo delle query sql..)..
MA qui sorge il problema.... Come farlo?? Che codice devo mettere per aggiungere gli item???
Il mio codice --->
Private Sub RadioButton1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RadioButton1.CheckedChanged
PictureBox1.ImageLocation = "C:\Documents and Settings\Ale\Documenti\ALE\PC\PROGRAMMAZIONE\pc assembler\PC ASSEMBLER\PC ASSEMBLER\images\intel.jpg"
ComboBox1.Items.Add(Me.ProcessoriTableAdapter.querymarcaprocintel(Me.ComponentiDataSet.processori))
End Sub
---> NON FUNZIONA
Radiobutton1 è un radiobutton con cui l'utente sceglie di vedere solo processori intel.
querymarcaprocintel è una query che restituisce i nomi dei modelli di processori di marca intel...
VI PREGO HELP ME :D
grazie..
querymarcaprocintel è una query che restituisce i nomi dei modelli di processori di marca intel...
ComboBox1.Items.Add() è il metodo giusto. Il problema sta evidentemente in tutto quello che segue.
Esattamente cosa dovrebbe restituire ( intendo, il tipo di dato... ) quella roba che dai in pasto al ComboBox1.Items.Add ?
Una stringa... una combinazione di numeri e lettere....
ALTRE INFO:
nome database: componenti
nome tabella: processori
query sql:
SELECT modello
FROM processori
WHERE marca= N'intel' ------> questa sono sicurissimo ke funge
Una stringa... una combinazione di numeri e lettere....
Avesse restituito un array di stringhe l'avrei capito ( con la Combo caricavi l'array in un colpo solo... )
Se restituisce una stringa allora in quella Combo avrai sempre e solo un elemento.
Non entro nel merito del tuo progetto, perchè non potendolo vedere sarebbe cmq inutile, ma non era (molto) più semplice via codice con un semplice DataReader ?
||ElChE||88
23-02-2009, 23:09
Se restituisce un array usa ComboBox1.Items.AddRange.
Avesse restituito un array di stringhe l'avrei capito ( con la Combo caricavi l'array in un colpo solo... )
Se restituisce una stringa allora in quella Combo avrai sempre e solo un elemento.
Non entro nel merito del tuo progetto, perchè non potendolo vedere sarebbe cmq inutile, ma non era (molto) più semplice via codice con un semplice DataReader ?
Eh??? :D cos'è un datareader?? Scusa ma non sono molto ferrato :D
Se restituisce un array usa ComboBox1.Items.AddRange.
Usando questo mi da errore "Impossibile convertirer il valore di tipo 'Integer' a 'Matrice in 1 dimensioni di Object'" <---- ???
EDIT:
ho provato anche così:
Dim arr
arr = New ArrayList(Me.ProcessoriTableAdapter.querymarcaprocintel(Me.ComponentiDataSet.processori))
ComboBox1.Items.AddRange(arr)
ma mi da 3 righe di errore "risoluzione dell'overload non riuscito perchè nessun 'new' accessibile può essere chiamato senza una conversione verso un tipo di dati più piccolo [......]"
Per forza. Se avevi detto che ritorna una stringa, non puoi usare .AddRange :doh: .
Il concetto del DataReader ( esempio su DB Access ) è il seguente :
Dim CN As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & percorsoDB & nomeDB & ";Persist Security Info=False")
Dim strSql As String = "SELECT * FROM Tabella WHERE condizioni..."
Dim CMD As New OleDb.OleDbCommand(strSql, CN)
CN.Open()
Dim RDR As OleDb.OleDbDataReader = CMD.ExecuteReader()
While (RDR.Read())
ComboBox1.Items.Add(RDR("nomeCampo"))
End While
RDR.Close()
CN.Close()
10 righe di codice e nessun utilizzo di componenti definiti a design.
E il gioco è fatto. ;)
Chiaramente se hai N Combo, puoi parametrizzarla ( ne fai una Function che riceve in ingresso la SELECT e ti ritorna un DataReader... ).
Grazie Marcogg... Ma non funziona... non riesce ad aprire il database... mi dice che non lo trova , ma ho controllato 100 volte il percorso ed è giusto...
Ora succede una cosa strana..
Con questo codice -->
ComboBox3.Items.Add(Me.ProcessoriTableAdapter1.Fill(Me.ComponentiDataSet1.processori))
Mi inserisce il numero di righe presenti nel database!! Boh
la query che ho usato è Fill--> SELECT modello FROM processori...
Ho inserito due modelli per cui nel combobox mi inserisce semplicemente "2"...:confused: :confused:
Grazie Marcogg... Ma non funziona... non riesce ad aprire il database... mi dice che non lo trova , ma ho controllato 100 volte il percorso ed è giusto...
percorsoDB deve essere il percorso completo e deve finire con la back-slash "\". Es.: "C:\cartellaDB\"
nomeDB deve essere il nome secco, senza percorso, ossia ad es.: "nomeDB.mdb".
E vedrai che funziona ;) .
Ora succede una cosa strana..
Con questo codice -->
ComboBox3.Items.Add(Me.ProcessoriTableAdapter1.Fill(Me.ComponentiDataSet1.processori))
Mi inserisce il numero di righe presenti nel database!! Boh
la query che ho usato è Fill--> SELECT modello FROM processori...
Ho inserito due modelli per cui nel combobox mi inserisce semplicemente "2"...:confused: :confused:
Ecco, io quel sistema lì lo butterei proprio...
Ma se il database è in formato .sdf (quello creato direttamente con visual basic) cambia qualcosa?
Ma se il database è in formato .sdf (quello creato direttamente con visual basic) cambia qualcosa?
Eh, direi di sì. Potevi dirlo prima che usi .sdf :p .
Cmq, l'esempio per Access è molto simile anche nel caso del Db .sdf.
Per la stringa di connessione ti rimando qui :
http://www.connectionstrings.com/sql-server-2005-ce
Per il resto prova prima con gli oggetti OleDb ( ho il sospetto che possa funzionare lo stesso ), poi con Sql ( SqlConnection, SqlCommand ecc... ) o SqlCe ...
La struttura del codice e l'utilizzo del DataReader non cambiano in ogni caso. ;)
Mi sa che non funziona perchè mi dice "Formato di database [...]\componenti.sdf' non riconosciuto.".....
Mi sa che non funziona perchè mi dice "Formato di database [...]\componenti.sdf' non riconosciuto.".....
Usa le classi Sql.
Ho provato con questo codice:
Dim conn As New SqlClient.SqlConnection("Data Source = componenti.sdf; Persist Security Info=False;")
Dim sqlQ As String = "SELECT modello FROM processori"
Dim command As New SqlClient.SqlCommand(sqlQ, conn)
conn.Open()
Dim reader As SqlClient.SqlDataReader = command.ExecuteReader()
While (reader.Read())
ComboBox3.Items.Add(reader("modello"))
End While
reader.Close()
conn.Close()
Non mi da errori ma il debug si blocca e non fa niente..
Cmq grazie 6 gentilissimo a rispondermi ;)
Prova con gli oggetti dello SpaceName System.Data.SqlServerCe.
Se dovesse fallire anche lì, mi sa che il tuo DB ha qualche problema...
Graziee funzionaaa!!!!:D
:cool:
Ho notato una cosa: se definisco sqlQ direttamente come una stringa (esempio "SELECT modello FROM processori" il codice funziona perfettamente...
Se però inserisco una variabie mi da errore "l'identificatore non può essere una stringa vuota" :confused: esempio: sqlQ = "SELECT modello FROM processori WHERE frequenza >=" & textbox1.text & " AND frequenza <=" & textbox2.text & """"
WHY??
PS: le quattro virgolette alla fine vengono lette come una sola....
Il problema sono proprio quelle quattro doppie virgolette, alla fine.
& """"
A che servono ? Eliminale.
Ti ritrovi una doppia virgola alla fine della SELECT. Ovvio che non la interpreta correttamente.
Ma il fatto è che le istruzion SQL devono essere x forza tra virgolette (o no?) per cui avrei le virgolette all'inizio ma alla fine no.....
E ho visto che quelle 4 virgolette vengono viste come una sola (ho messo quel codice in una label...)...:confused:
'azzo però ancora una volta hai ragione tu! :D
Sono un ****** sono 4 ore ke provo a farlo funzionare convinto che le virgolette fossero indispensabile :( :D
NON SMETTERO' MAI DI RINGRAZIARTI!!!!! :) :D
Ok nuovo problema, questa volta non centra niente con l'SQL...
Dim querymarca
If CheckBox8.Checked = True And CheckBox9.Checked = True Then
querymarca = "SELECT modello FROM processori WHERE marca = 'amd' OR marca = 'intel' "
ElseIf CheckBox8.Checked = False And CheckBox9.Checked = False Then
querymarca = "SELECT modello FROM processori WHERE marca = 'amd' OR marca = 'intel' "
ElseIf CheckBox8.Checked = True And CheckBox9.Checked = False Then
querymarca = "SELECT modello FROM processori WHERE marca = 'intel' "
ElseIf CheckBox9.Checked = True And CheckBox8.Checked = False Then
querymarca = "SELECT modello FROM processori WHERE marca = 'amd'"
End If
Dim querytotale
querytotale = querymarca & querytipo & queryfreq & queryprz
alla fine,alla riga querytotale, mi dica che ho introdotto querymarca prima di averle assegnato un valore.... Ma non l'ho fatto 4 righe sopra???
Dim querymarca
...
Dim querytotale
alla fine,alla riga querytotale, mi dica che ho introdotto querymarca prima di averle assegnato un valore.... Ma non l'ho fatto 4 righe sopra???
Anzitutto :
Dim querymarca As String
Dim querytotale As String
Giustamente VB ha sottolineato quella dichiarazione ( in Verde, suppongo ), in quanto se poi le assegnazioni sono condizionate da uno o più IF ( e come nel tuo caso non si coprono tutte le possibilità ), non è detto che tale assegnazione avvenga, e questo può portare ad errori.
Infatti non è un vero errore di sintassi, ma un semplice Warning che il buon VB solleva per avvisare di possibili errori di runtime.
Puoi risolvere :
1. Assegnando un valore in fase di dichiarazione :
Dim miaStringa as String = "valoreDiDefault"
2. Coprendo con gli IF tutte le possibili combinazioni.
;)
Boh ho provato in tutte le salse ma non va.. Ma fa niente ho modificato il form e ora funge..
Ecco lo screen del form ke ho fatto ( e incredibilmente è funzionante!:D )
LINK---> http://img516.imageshack.us/img516/8688/pcassembler.jpg
Che ne pensate??
COMUNQUE, non penserete che sono tornato solo x mostrarvi questo, ma x un'altra domanda...:D ...
Ora io vorrei passare i dati del listbox del carrello ad un altro form (il form 'schedamadre'... Il primo form era 'processori').... Ma... Come fare???
ListBox4.Items.Add(processori.ListBox4.Items)
Non funziona :confused: :confused:
Thanks 4 the answer!!!
ListBox4.Items.Add(processori.ListBox4.Items)
Non funziona :confused: :confused:
Eh no. Non siamo ancora ad un livello di semplicità tale... :D
Anzitutto quella Form "processori" che chiami deve essere il nome dell'istanza, non della classe ( errore che fanno TUTTI quelli che iniziano con .NET... :stordita: ).
Io risolverei così. Esempio :
Dim arrayItems(Me.ComboSource.Items.Count - 1) As Object
Me.ComboSource.Items.CopyTo(arrayItems, 0)
FormCombo.ComboTarget.Items.AddRange(arrayItems)
FormCombo è l'istanza della Form che contiene la Combo di destinazione...
;)
Wow funziona!!
Ma cm fai a sapere tt queste cose??
Cmq grazie :D ;)
Ehm.. Scusa se abuso della tua gentilezza e della tua estrema sapienza... Ma ho un'altra domanda...
Se io ho un database in cui ho degli elementi che si ripetono e volessi inserirli in un combobox ma senza che quelli uguali si ripetano come potrei fare??
Mi spiego meglio... Ora sto facendo il database delle schede madri, quindi ho un database con una colonna 'marca' e una 'modello'. Ovviamente i dati inseriti nella colonna marca possono essere uguali, in quanto una stessa marca può fare modelli diversi. Se volessi però che nel combobox dove voglio inserire le marche queste non si ripetano come devo fare???
Lo puoi fare semplicemente a livello di richiesta al DB, modificando la SELECT :
SELECT marca FROM T_schedemadri
ritorna tutte le voci trovate, mentre...
SELECT DISTINCT marca FROM T_schedemadri
ritorna tutte le voci prese una sola volta ( niente doppioni ). ;)
Edgard Strolgher
24-03-2009, 12:24
Salve a tutti spero riusciate ad aiutare anche me
cerco di fare un form semplice una versione con combobox del normale radiobutton dove nel selezionare il radiobutton legato ad una lingua (english, espanol, deutsch) cliccando su un pulsante generava una frase diversa
per il radiobutton avrei usato questo codice
Private Sub rbtnDeutsch_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Language = "Deutsch"
btnHelloWorld.Text = "Verlängerung"
End Sub
ora se nella combobox ho english, espanol e deutsch in questo ordine come faccio ad dare la stessa indicazione per il radiobutton?
ho provato ad inserire
cbxLanguage.SelectedIndex=n
dove n sta al numero dell'elemento del box ma non riconosce l'evento.
Non so se ho capito bene quello che cerchi... Vuoi sincronizzare una Combo con i 3 RadioButton ?
Edgard Strolgher
24-03-2009, 14:02
nono...vediamo se riesco a spiegarmi, è un programmino semplice diciamo un compito di scuola
ho un pulsante che quando lo clicco mi cambia il testo della label, ho un menu a tendina con varie lingue, in base alla lingua selezionata quando clicco sul bottone deve darmi un testo diverso
tutto il form è completato perche ho usato come base un programma identico fatto con i radiobutton io però ora lo devo fare con la list box il primo codice che ho messo e quello normale per il radiobutton come devo fare o cosa devo cambiare per ottenere lo stesso effetto sulla combobox?
Vabbeh, faccio un po' fatica a capire cosa scrivi... Usa almeno la punteggiatura, per pietà ! :D
In ogni caso :
1. Il codice che hai postato sul RadioButton è sbagliato, o almeno, non produce alcun effetto utile, in quanto l'evento CheckedChanged non basta da solo. Quello serve solo ad "accorgersi" se lo stato del RadioButton è passato da false a true o viceversa. Inoltre manca la clausola Handles, il che fa pensare ad un copia-incolla riuscito male.
2. Il codice per la combobox non è corretto. Se la Combo è già popolata, per intercettarne il valore selezionato dall'utente bisogna anzitutto impostarne la proprietà DropDownStyle = DropDownList. L'evento è il SelectedIndexChanged :
Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
Dim linguaScelta As String = ComboBox1.Text
End Sub
Edgard Strolgher
24-03-2009, 23:52
Avrò sbagliato a copiarlo dal progetto perche debuggandolo va tutto alla perfezione
allora il documento sui radiobutton era un form e un modulo
Modulo
Module HelloModule
Sub SayHello(ByVal HelloLanguage As String)
Select Case HelloLanguage
Case "English"
frmHelloLanguage.lblHelloLanguage.Text = "Hello World!"
Case "Espanol"
frmHelloLanguage.lblHelloLanguage.Text = "Hola Mundo!"
Case "Italiano"
frmHelloLanguage.lblHelloLanguage.Text = "Ciao Mondo!"
Case Else
frmHelloLanguage.lblHelloLanguage.Text = "Select language!"
End Select
End Sub
End Module
Form
Public Class frmHelloLanguage
Dim Language As String
Private Sub btnHelloLanguage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHelloLanguage.Click
HelloModule.SayHello(Language)
End Sub
Private Sub rbtnEnglish_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtnEnglish.CheckedChanged
Language = "English"
btnHelloLanguage.Text = "Show"
End Sub
Private Sub rbtnEspanol_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtnEspanol.CheckedChanged
Language = "Espanol"
btnHelloLanguage.Text = "Muestra"
End Sub
Private Sub rbtnItaliano_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles rbtnItaliano.CheckedChanged
Language = "Italiano"
btnHelloLanguage.Text = "Mostra"
End Sub
End Class
Il form in progettazione, contiene tre radiobutton (rbtnLingua) un pulsante (btnHelloLanguage) e una label (lblHelloLanguage)
Il compito è il seguente: Creare lo stesso identico programma usando una scelta su combobox al posto dei radiobutton. Come posso fare?
Semplice :
1. Creo la Combo "cmb_Language" e imposto DropDownStyle = DropDownList. Tramite designer o codice popolo la Combo con English, Espanol, Italiano.
2. Aggiungo nel Form Load per evitare una selezione vuota :
Private Sub frmHelloLanguage_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
cmb_Language.Text = cmb_Language.Items(0)
End Sub
3. Gestisco la Combo :
Private Sub cmb_Language_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmb_Language.SelectedIndexChanged
Language = cmb_Language.Text
Select Case Language
Case "English"
btnHelloLanguage.Text = "Show"
Case "Espanol"
btnHelloLanguage.Text = "Muestra"
Case "Italiano"
btnHelloLanguage.Text = "Mostra"
Case Else
'...
End Select
End Sub
;)
Edgard Strolgher
25-03-2009, 10:46
accidenti ma sei un grande...c'erano un po di cose da sistemare in base al nome della combobox che prima l'hai chiamata "cmbLanguages" e poi nel codice l'hai chiamata "cmb_Language" però alla fine funziona
Grazie Marco ^^
accidenti ma sei un grande...c'erano un po di cose da sistemare in base al nome della combobox che prima l'hai chiamata "cmbLanguages" e poi nel codice l'hai chiamata "cmb_Language" però alla fine funziona
Grazie Marco ^^
Visto ? Non c'è come spiegarsi chiaro che la soluzione arriva subito. ;)
P.S.: Corretto mio post precedente con "cmb_Language".
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.