PDA

View Full Version : [Visual Basic 2008] Combobox & database...


ale09hh
23-02-2009, 15:29
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..

MarcoGG
23-02-2009, 17:51
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 ?

ale09hh
23-02-2009, 17:56
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

MarcoGG
23-02-2009, 21:26
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.

ale09hh
24-02-2009, 09:01
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

ale09hh
24-02-2009, 09:09
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 [......]"

MarcoGG
24-02-2009, 09:55
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... ).

ale09hh
25-02-2009, 11:53
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:

MarcoGG
25-02-2009, 17:16
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...

ale09hh
25-02-2009, 19:29
Ma se il database è in formato .sdf (quello creato direttamente con visual basic) cambia qualcosa?

MarcoGG
26-02-2009, 08:25
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. ;)

ale09hh
26-02-2009, 09:01
Mi sa che non funziona perchè mi dice "Formato di database [...]\componenti.sdf' non riconosciuto.".....

MarcoGG
26-02-2009, 09:09
Mi sa che non funziona perchè mi dice "Formato di database [...]\componenti.sdf' non riconosciuto.".....

Usa le classi Sql.

ale09hh
26-02-2009, 10:09
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 ;)

MarcoGG
26-02-2009, 12:00
Prova con gli oggetti dello SpaceName System.Data.SqlServerCe.
Se dovesse fallire anche lì, mi sa che il tuo DB ha qualche problema...

ale09hh
26-02-2009, 18:56
Graziee funzionaaa!!!!:D

MarcoGG
27-02-2009, 07:57
Graziee funzionaaa!!!!:D
:cool:

ale09hh
27-02-2009, 14:13
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....

MarcoGG
27-02-2009, 16:54
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.

ale09hh
27-02-2009, 17:58
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:

ale09hh
27-02-2009, 18:50
'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

ale09hh
28-02-2009, 09:41
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???

MarcoGG
28-02-2009, 12:20
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.

;)

ale09hh
02-03-2009, 16:50
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!!!

MarcoGG
02-03-2009, 17:30
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...
;)

ale09hh
03-03-2009, 13:26
Wow funziona!!

Ma cm fai a sapere tt queste cose??

Cmq grazie :D ;)

ale09hh
03-03-2009, 16:49
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???

MarcoGG
03-03-2009, 21:39
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.

MarcoGG
24-03-2009, 13:17
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?

MarcoGG
24-03-2009, 22:44
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?

MarcoGG
25-03-2009, 07:56
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 ^^

MarcoGG
25-03-2009, 11: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 ^^

Visto ? Non c'è come spiegarsi chiaro che la soluzione arriva subito. ;)

P.S.: Corretto mio post precedente con "cmb_Language".