Problema DataGridView e DataGridViewComboBoxColumn

mercoledì 05 dicembre 2007 - 18.10

maurizio.c Profilo | Newbie

Salve a tutti, ho questo problema.
Nel form ho una DataGridView con x colonne. Dalla proprietà della DataGridView ho impostato
i nomi delle colonne che mi servono, mentre a runtime imposto il valore DataPropertyName.
Una di queste colonne l'ho impostata come DataGridViewComboBoxColumn sempre tramite le
proprietà dell'oggetto.
A Runtime ho fatto il binding della colonna combo con i dati che prelevo ed anche il binding
della DataGridView è fatto a runtime, di seguito riporto un po di codice :

'binding della DataGridView
bindingSource1.DataSource = table
Grid.Columns(0).DataPropertyName = "Gi"
Grid.Columns(1).DataPropertyName = "Ora"
Grid.Columns(2).DataPropertyName = "Hs"
Grid.Columns(3).DataPropertyName = "Ts"
Grid.Columns(4).DataPropertyName = "Dw"

Dim ColonnaCombo As DataGridViewComboBoxColumn
'estraggo i dati che mi servono per la combo
PreparaCombo()
ColonnaCombo = Grid.Columns(5)
ColonnaCombo .DataPropertyName = "fi" 'campo presente nel bindingSource1
ColonnaCombo .DataSource = dt ' datatable con i dati che ho estratto
ColonnaCombo .DisplayMember = "cognome"
ColonnaCombo .ValueMember = "id"
Quello che non riesco a fare è inserire una riga vuota con un valore tipo -1 in modo
che non vada in errore il caricamento della DataGridView quando il cambo impostato
nella DataPropertyName ha un valore non presente all'interno della combobox
perchè all'inizio i dati visualizzati nella combo non sono completi e potrei riempire il campo
specifico con un valore -1, o in alternativa
a gestire l'errore in DataError in modo che non si blocchi la creazione della DataGridView
quando trova un valore non presente nella combo.

L'applicazione è sviluppata con vb.net 2005, il database è MsSql

Grazie per qualsiasi consiglio

SSUPERPIPPO Profilo | Guru

>Salve a tutti, ho questo problema.
>Nel form ho una DataGridView con x colonne. Dalla proprietà della
>DataGridView ho impostato
>i nomi delle colonne che mi servono, mentre a runtime imposto
>il valore DataPropertyName.
>Una di queste colonne l'ho impostata come DataGridViewComboBoxColumn
>sempre tramite le
>proprietà dell'oggetto.
>A Runtime ho fatto il binding della colonna combo con i dati
>che prelevo ed anche il binding
>della DataGridView è fatto a runtime, di seguito riporto un po
>di codice :
>
>'binding della DataGridView
> bindingSource1.DataSource = table
> Grid.Columns(0).DataPropertyName = "Gi"
> Grid.Columns(1).DataPropertyName = "Ora"
> Grid.Columns(2).DataPropertyName = "Hs"
> Grid.Columns(3).DataPropertyName = "Ts"
> Grid.Columns(4).DataPropertyName = "Dw"
>
> Dim ColonnaCombo As DataGridViewComboBoxColumn
> 'estraggo i dati che mi servono per la combo
> PreparaCombo()
> ColonnaCombo = Grid.Columns(5)
>ColonnaCombo .DataPropertyName = "fi" 'campo presente nel bindingSource1
>ColonnaCombo .DataSource = dt ' datatable con i
>dati che ho estratto
> ColonnaCombo .DisplayMember = "cognome"
> ColonnaCombo .ValueMember = "id"
>Quello che non riesco a fare è inserire una riga vuota con un
>valore tipo -1 in modo
>che non vada in errore il caricamento della DataGridView quando
>il cambo impostato
>nella DataPropertyName ha un valore non presente all'interno
>della combobox
>perchè all'inizio i dati visualizzati nella combo non sono completi
>e potrei riempire il campo
>specifico con un valore -1, o in alternativa
>a gestire l'errore in DataError in modo che non si blocchi la
>creazione della DataGridView
>quando trova un valore non presente nella combo.
>
>L'applicazione è sviluppata con vb.net 2005, il database è MsSql
>
>Grazie per qualsiasi consiglio
>

E' il classico e ricorrente problema nell'utilizzo delle combobox in binding con una DataTable.
Basta che aggiungi al DataTable il record con il valore a -1.

Un esempio:

Dim Tbl As DataTable ' Crei il tuo DataTable da collegare alla combo ... ' Aggiungi il Record al tuo DataTable prima di effettuare il binding con la combobox Dim NewRow as DataRow NewRow=Tbl.Rows.Add() NewRow.Item("ID")=-1 ' Se vuoi che il record vuoto venga visualizzato per primo nella tua combo basta ' che crei un DataView derivante dalla tua tabella ordinato per il campo ID Dim DtView As New DataView DtView.Table = Tbl DtView.Sort = "ID" ' Ora colleghi il tuo DataView alla combo TuaCombo.DataSource = DtView TuaCombo.DisplayMember = "Descrizione" TuaCombo.ValueMember = "ID"

Spero di aver centrato il problema e di esserti stato di aiuto.

Ciao

Alessandro

http://blogs.dotnethell.it/alebadalin

maurizio.c Profilo | Newbie

Grazie della info, problema risolto in questo modo,
non ci avevo pensato proprio.

Geronimo79 Profilo | Junior Member

Salve a tutti….uso Vb.net 2008 e Sqlserver 2008 express. Ho una tabella composta da 2 campi: ID, POSIZIONE

Dopo aver eseguito un insert, popolo il datagridview1 in questo modo:


Dim connetionString2 As String
Dim connection2 As SqlConnection
Dim adapter2 As SqlDataAdapter
Dim cmdBuilder2 As SqlCommandBuilder
Dim ds2 As New DataSet
Dim sql2 As String
Dim i2 As Int32



connetionString2 = "Data Source=localhost\sqlexpress;Initial Catalog=bet54;User Id=sa;Password=YGB765"
connection2 = New SqlConnection(connetionString2)
sql2 = "select posizione from ANAGRAFICA"

Try
connection2.Open()
adapter2 = New SqlDataAdapter(sql2, connection2)
adapter2.Fill(ds2)
connection2.Close()

datagridview1.DataSource = ds2.Tables(0)
Catch ex As Exception
MsgBox(ex.ToString)
End Try

La colonna “Posizione” può contenere soltanto valori tipo 1 oppure 2 oppure 3. Vorrei convertirla in “datagridcombobox” contenente valori “item” 1,2,3…..nel momento in cui vado a caricare il datagridview, per ogni record visualizzato, la nuova colonna convertita deve posizionare i suoi “item” sul valore 1 o 2 o 3 in base a ciò che è stato precedentemente inserito.
Spero di aver illustrato bene il problema. Grazie dell’aiuto a tutti a presto.
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5