Costruire un array

venerdì 13 maggio 2011 - 21.04

gianni01 Profilo | Newbie

Salve a tutti, lo so che mi manderete a quel paese perchè ciò che sto chiedendo e stato trattato e ritrattato migliaia di volte, ma sono in difficoltà.
Riassumo il problema: ho una combobox (cmbCodiciContatti) una textbox (txtNomeCategoria) una database in SQL 2008 (Easy_Sale) con una tabella (tbCatAgenti) e tre campi (ID, Categoria, Nome_categoria), dovrei riempire la combobox con il campo Categoria e conseguentemente la textbox con il campo Nome_categoria.
Navigando in internet ho trovato il cosice che allego e credo sia adatto al mio scopo, ma sinceramente non so come correggerlo per la mia necessità e, soprattutto non so come realizzare l'array.
Vi chiedo umilmente un po di pazienza e un aiuto a sistemare il codice.

La connessione al db è fatta cosi:
Conn = New SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("DBConnection").ConnectionString)
Conn.Open()
Using cmd As New SqlClient.SelectCommand = "SELECT Categoria, Nome_categoria FROM tbCatAgenti WHERE (ID= " & Data.Tables("utente").Rows(0).Item("Categoria") & ") ORDER BY Categoria", Conn)

....... ma non so come andare avanti, dove mettere questa connessione e come leggere i dati.

Grazie a tutti per l'aiuto.

Codice:

Dim cn As ADODB.Connection

Private Sub Form_Load()
Dim cnString As String
Dim dbpath As String
Dim rs As ADODB.Recordset
Dim sql As String

' imposta il database da aprire
dbpath = "C:\MiaCartella\MioDatabase.mdb"
' apre la connessione
cnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _
& dbpath & ";User Id=admin;Password=;"
cn = New ADODB.Connection
cn.Open(cnString)

' apre il recordset sulla tabella
sql = "SELECT IDComune, NomeComune FROM Comuni ORDER BY NomeComune;"
rs = New ADODB.Recordset
rs.Open(sql, cn, adOpenForwardOnly, adLockReadOnly, adCmdText)

' controlla che il recordset non sia vuoto
If Not (rs.BOF And rs.EOF) Then
' se non è vuoto, cicla fino alla fine del recordset...
Do While Not rs.EOF
' ... aggiungendo una voce per volta alla combo:
' il campo descrittivo nella voce...
cboComuni.AddItem(rs.Fields("NomeComune").Value & "")
' ... e il campo ID nella proprietà ItemData
cboComuni.ItemData(cboComuni.NewIndex) = rs.Fields("IDComune").Value
' dopo aver aggiunto la nuova voce, si sposta sul record successivo
rs.MoveNext()
Loop
Else
' se il recordset è vuoto, aggiunge solo un messaggio generico
cboComuni.AddItem("<nessun comune in archivio>")
cboComuni.ItemData(cboComuni.NewIndex) = 0
End If

' chiude e distrugge il recordset
rs.Close()
rs = Nothing
End Sub

Private Sub Form_Unload(ByVal Cancel As Integer)
' quando non serve più, chiude e distrugge la connessione
cn.Close()
cn = Nothing
End Sub



........ anche perchè ricevo il messaggio di errore che "AddItem" "ItemData" non fanno parte della combobox.

Spero in un vostro supporto, grazie a tutti.

Cteniza Profilo | Guru

E' decisamente opportuno che tu dimentichi il termine "recordset".
Quanto sapevi si faceva con adodb lo devi dimenticare.
Gli oggetti che devi utilizzare ora sono:
Database Access o altri database ex oledb
OleDbConnection
OleDbCommand
OleDbDataAdapter
OleDbDataReader
OleDbCommandBuilder

Database Sql server
SqlConnection
SqlCommand
SqlDataAdapter
SqlDataReader
SqlCommandBuilder

Ciascun provider di database che abbia implementato un proprio driver ha questi oggetti differenziati per il proprio database.
Ti consiglio, prima di metterti alla tastiera e scrivere del codice (ma che cosa scriveresti?) di leggere un buon manuale di ado.net come quello di Sceppa anche se vecchiotto.
Esiste anche la possibilità di generare dati locali utilizzando LINQ o Entity Framework ma .. guardare questi ora per te che non ne sai nulla potrebbe essere problematico.
Purtroppo su .net è impossibile dare dei suggerimenti che ti risolvono il problema contingente se non hai presenti le "basi", rischieresti di non capire neanche le risposte che ti si danno.

gianni01 Profilo | Newbie

Grazie cteniza per la risposta, ma voleo solo chiarire un punto, nella mia domanda ho chiesto come realizzare l'array, ovvero come popolare la combo e la texbox, se rileggi velocemente il mio primo messaggio c'è il riferimento a tutto, ci sono i nomi dei controlli che stò utilizzando e la connessione al db ( SQL) come l'ho costruita.
Certo che devo dimenticare i vecchi comandi e sopratutto non sto lavorando con access.
Chiedevo un aiuto a ricomporre il codice (indicarmi qualche esempio di sintassi sullla base dei mie riferimenti) in modo che posa avere l'array e il popolamento delle combo.
So perfettamente che quanto ho indicato non è il codice giusto ma era solo per trasmettere il messaggio di ciò che necessito.
Grazie ancora per l'aiuto e la disponibilità.

Cteniza Profilo | Guru

ok, allora mostra tutto il codice che hai utilizzato per popolare la datatable che citi nella select

gianni01 Profilo | Newbie

Credo di esserci riuscito cteniza (me lo auguro)
Di seguito indico il codice che ho realizzato:

Dim Conn As SqlClient.SqlConnection
Dim sql As String
Dim da As New SqlClient.SqlDataAdapter

Conn = New SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings("DBConnection").ConnectionString)
Conn.Open()

sql = "SELECT ID, Categoria, Nome_Categoria"
sql = sql & " FROM tbCatAgenti ORDER BY Categoria"

Using cmd As New SqlClient.SqlCommand(sql, Conn)

da.SelectCommand = cmd

Dim ds As New DataSet("dsCategoria")
da.MissingSchemaAction = MissingSchemaAction.AddWithKey
ds.Clear()
da.Fill(ds, "tbCatAgenti")


cmbCodiciContatti.DataSource = ds.Tables("TbCatAgenti")
cmbCodiciContatti.DisplayMember = "Categoria"
cmbCodiciContatti.ValueMember = "ID"


Private Sub cmbCodiciContatti_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbCodiciContatti.SelectedValueChanged

txtNomeCategoria.Text = cmbCodiciContatti.SelectedValue.ToString
txtNomeCategoria.Text = cmbCodiciContatti.SelectedItem("Nome_categoria")

End Sub

è rimasto solo un piccolo errore, ovvero ho collegato alla combobox una textbox, ma sulla riga "SelectedItem" mi da Option Strict On non consente l'associazione tardiva, come posso correggere questo errore?
Grazie ancora.

Cteniza Profilo | Guru

Per me dovresti utilizzare un bindingsource, collegare il bindingsource alla tua tabella, e collegare sia combo che textbox al bindingsource
In ogni caso per il binding su texbox NON puoi utilizzare quel comando, è sbagliato.
una cosa del genere mytextbox.DataBindings.Add("Text", mybindingsource, "campo")

gianni01 Profilo | Newbie

Ciao cteniza, è vero che per programmare bisogna sapere le cose, io ci sto mettendo tutta la buona volontà, ma se faccio una cosa e ne nasce una nuova, non ci arrivo più.
Mi avevi chiesto di mettere il codice che sto utilizzando e cosi ho fatto, nel mio form ho i vari databindingsource delle tabelle che sto utilizzando, le ho trascinate sulle form dall'IDE e si sono creati automaticamente, poi sempre dall'IDE se vado nelle proprietà dei vari controlli e seleziono datasource, text, selectedvalue, ....item ecc. ecc. collego i mie controlli alle tabelle e cosi via, come ben sai.
Ma volevo intraprendere una strada diversa, ovvero impararare anche a popolare i controlli via codice e sopratutto collegare la mia textbox alla combo, ovvero se seleziono un nuovo valore dalla combo vorrei che cambiasse anche nella textbox.
Mi sembra di aver capito che con i "TAG" sempre dall'IDE si possa risolvere la cosa.
Ma via codice come devo fare ? se ti è possibile ti chiedo ti scrivermi un esempio pratico come dovrei fare.
Chiedo semplicemente un esempio iniziale per capire come legare i due controlli, da quello che sono riuscito a realizzare (non sto a discutere su quanto ho sviluppato, sicuramente ci saranno soluzioni migliori, per me questo è già un passo avanti, penso che anche tu a tuo tempo avrai imparato) la combo viene popolata, ma come faccio a legare la textbox alle selezioni della combo?
Possibilmente senza arrabbiarti, se sono qui, sono qui per chiedere aiuto non per rompere le scatole a qualcuno.
Grazie ancora dell'aiuto.

Cteniza Profilo | Guru

Allora se vuoi "fare tutto a mano" guarda questo mio esempio che NON utilizza datagridview e bindingsource.
http://community.visual-basic.it/lucianob/archive/2007/02/23/16583.aspx
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5