Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
10/04/09 21:35
Furion
Salve ragazzi, sto tentando di creare un programmino che mi consenta di riempire con dei dati di prova alcuni database sul mio server locale. In diversi punti del prog eseguo dei comandi/query di mysql e con questi risultati popolo delle DataGridView. Ad un certo punto invoco il comando DESCRIBE <Nome_Tabella> con il quale ottengo una tabella con la descrizione di tutti i campi della tabella specificata. Vorrei inserire questa tabella nella mia DataGridView ma, inspiegabilmente, la mia grid crede che due delle colonne siano di tipo immagine ed, ovviamente, mi da errore e mi mostra una "Finestra di dialogo d'errore predefinita per la DataGridView" o qualcosa del genere. La grid in realtà non possiede alcuna colonna (gliele faccio auto-generare) e questo è il codice che sto usando:

Dim ds As DataSet = New DataSet()
adp = New MySQLDataAdapter("DESCRIBE " + table + ";", mainForm.mysqlconn)
adp.Fill(ds, "tabella")
tabDescGrid.DataSource = ds
tabDescGrid.DataMember = ds.Tables(0).TableName


Come posso risolvere? :(
Ultima modifica effettuata da Furion 10/04/09 21:36
aaa
11/04/09 8:22
Il Totem
Non so che dirti. Hai provato ad aggiungere colonne e righe a mano?
aaa
11/04/09 9:10
Furion
Si ho provato. Se le aggiungo a mano e gli dico di non auto generarle l'errore non me lo dà perchè la grid non me la riempie. Se invece le aggiungo a mano ma continuo a fargliele auto generare mi da quelle che ho messo io (vuote) + quelle autogenerate (con i valori che voglio) e mi dà lo stesso errore. Da quel poco che ho capito, sembra che lui generi questa eccezione quando tenta di disegnare i contenuti della mia tabella, poichè crede che due delle colonne siano di tipo immagine mentre in realtà l'adattatore MySQL gli passa (giustamente) tutte colonne di tipo stringa.
aaa
12/04/09 8:56
Il Totem
Postato originariamente da Furion:
Se le aggiungo a mano e gli dico di non auto generarle l'errore non me lo dà perchè la grid non me la riempie.

Certo che non te la riepie, devi essere tu a farlo. Era quello che intendevo io. Ossia una cosa del genere:
For Each C As DataColumn In DataSet.Tabella.Columns
  DataGridView.Columns.Add(C.Caption, C.Caption)
Next
For Each R As DataRow In DataSet.Tabella.Rows
  DataGridView.Rows.Add(R.ItemArray())
Next

Forse ti dirà che non riesce a convertire Object() in String(), allora scrivi una funzione per farlo, io non ho fatto per velocità.
aaa
12/04/09 16:46
Furion
Oddio scusa: io pensavo che l'attributo "AutoGenerateColumns" di una DataGridView si occupasse solo di aggiungere le colonne alla grid, non che le riempisse anche. Scusate ma con le grid e i dataset sono un super n00b. Allora usando il codice che mi hai dato la faccenda migliora molto perchè non mi da errore. Solo che al posto di uscirmi una cosa tipo

#=============#=============#==========#==============#=================#=======#
# Field       # Type        # NULL     # Key          # Default         # Extra #
#=============#=============#==========#==============#=================#=======#
# <NomeCampo> # <TipoCampo> # <YES/NO> # <TipoChiave> # <ValoreDefault> # ????? #
#=============#=============#==========#==============#=================#=======#


mi esce:

#=============#===============#==========#==============#=================#=======#
# Field       # Type          # NULL     # Key          # Default         # Extra #
#=============#===============#==========#==============#=================#=======#
# <NomeCampo> # System.Byte[] # <YES/NO> #              #                 #       #
#=============#===============#==========#==============#=================#=======#


EDIT: Ok ho risolto così

Dim ds As DataSet = New DataSet()
adp = New MySQLDataAdapter("DESCRIBE " + table + ";", mainForm.mysqlconn)
adp.Fill(ds, "tabella")
tabDescGrid.AutoGenerateColumns = False
For Each C As DataColumn In ds.Tables("tabella").Columns
    tabDescGrid.Columns.Add(C.Caption, C.Caption)
Next
For Each R As DataRow In ds.Tables("tabella").Rows
    Dim tipo As String = ""
    For Each b As Byte In R.Item(1)
        tipo = tipo + Chr(b)
    Next
    tabDescGrid.Rows.Add(R.Item(0), tipo, R.Item(2), R.Item(3), R.Item(4), R.Item(5))
Next


soluzione rozza ma funzionante :rofl: Raga già che ci sono, quando carico un form col comando <NomeForm>.Show(), come faccio ad attivare (nel senso di farci comparire il cursore di modifica, quello lampeggiante) una textbox al suo interno? Ho provato con <NomeTextBox>.Focus() e <NomeTextBox>.Select() ma non accade nulla... ci devo cliccare col mouse per attivarla... :D GRAZIE ANCORA DI TUTTO!! :yup:
Ultima modifica effettuata da Furion 12/04/09 16:59
aaa
12/04/09 19:46
ruggy94
Penso sia un problema dovuto al fatto che metti il Textbox.Focus() nell'evento Load del form2. È così che stai facendo?
aaa
13/04/09 8:15
Il Totem
<Nome form>.<Text Box>.Focus()
questo non va?
aaa
13/04/09 14:39
Furion
Esatto, ma forse sbaglio evento. In pratica io ho un form in cui ho abilitato la proprietà "IsMDIContainer" (chiamiamolo A) e all'interno del quale faccio caricare altri form, chiamiamo B uno di questi (che poi non è altro che il primo). Ad un certo punto, premendo un bottone di A (per la precisione un ToolStripButton) faccio ricomparire il form B, gestendo l'evento Click del bottone. Una cosa tipo:

evento Click bottoneDiA
Me.formB.Dock = DockStyle.Fill
Me.formB.Show()
// per dichiare il form B, all'interno della classe A ho usato questo codice:
// Public formB As New B()
fine evento

A questo punto, all'interno dell'evento Enter di B (se lo faccio con Load e con Shown non mi funziona), ho messo un piccolo codice che mi pulisce le textbox all'interno di B e alla fine fa

unaDelleTextBoxDiB.Focus()

però la maledetta non si attiva. Abbiate pietà di un povero nubbo autodidatta.
Ultima modifica effettuata da Furion 13/04/09 14:41
aaa