Aggiungere riga a DataGridView bindato

martedì 23 aprile 2013 - 12.52
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Visual Studio Express  |  MySQL 5.5

lauretta Profilo | Newbie

Premetto che sono alle prime armi e che sto passando dalla teoria alla pratica in queste settimane.
Avrei bisogno di un paio di consigli su un progetto di prova che sto realizzando.

Ho un form dove è presente un DataGridView che è associato ad una tabella di 5 campi. Sono presenti anche 5 textbox che ho bindato allo stesso dataset della DGV.
Fin qui tutto ok, se clicco su una riga della DGV le textbox si popolano correttamente, se modifico un valore su una textbox questo viene riportato sulla DGV.
Ho 3 pulsanti, uno per cancellare una riga dal DGV (e funziona), uno per salvare le modifiche al DGV (e funziona), uno per aggiungere una nuova riga sul quale volevo chiedervi un aiuto.
Premetto che il DGV è settato su readOnly True e AllowUserToAddRows e AllowUserToDeleteRows su False.
Nell'evento click di questo pulsante ho due righe di codice:
- la prima "MyDataTable.Rows.Add()" mi aggiunge una riga al DGV
- la seconda "DGV.Rows(DGV.RowCount - 1).Cells(0).Selected = True)" simula il click sulla colonna 1 dell'ultima riga, in modo da associarmi le textbox a quella che dovrebbe essere la nuova riga inserita.
Qui avrei un problemino: se l'utente ha cliccato sulle intestazioni delle colonne e l'ordinamento è diverso da quello di default la riga potrebbe aggiungersi in una posizione che non è l'ultima, e quindi il codice sopra non funziona.
Qualche suggerimento? Ditemi anche se l'approccio è corretto.

Altra domanda.
Una delle colonne della tabella che visualizzo sul DGV è un codice che è collegato ad un'altra tabella.
Mi piacerebbe avere una textbox che mi visualizzi la descrizione associata al codice leggendola da un'altra tabella. Così quando clicco su una delle righe del DGV si ricaricano in automatico tutte le textbox, compresa questa con la descrizione.
Ho pensato di agire nell'evento TextChanged della textbox che contiene il codice, in modo da ricaricare la descrizione solo quando cambia, oppure potrei intervenire al click sul DGV e inserire nella textbox la descrizione. Ma forse esiste un modo più semplice e carino.... Non potrei bindare in qualche modo anche questa textbox?

Chiedo scusa per eventuali imperfezioni in quello che ho scritto, ma questo progetto di prova mi ha davvero esaurita!
Grazie, Laura.

AntCiar Profilo | Expert

ciao.

io farei in questo modo per l'aggiunta della riga:

al click sul bottone aggiungi metterei la DGV a Enabled = false. POi toglierei il binding dalle textbox e cancellerei il loro contenuto (così facendo anche se una eventualre riga in precedenza era stata selezionata e visualizata dalla DGV non viene toccata).

Poi sul bottone salva aggiungerei una DataRow alla sorgente della DGV con i campi già valorizzati (presi dalle textbox) e ripristinerei il binding delle textBox.


Per quanto riguarda il problema codice - descrizione le strade sono due:

1 - nella sorgente della DGV carichi anche la colonna con la descrizione. Poi nella DGV caso mai metti la visualizzazione solo della descrizione e non del codice (questo ovviamente è una scelta tua). Se decidi di farlo allora devi creare e associare manualmente le colonne al DGV.

2 - invece di utilizzare una TextBox per la visualizzazione della descrizione, utilizza una ComboBox. Questa la devi caricare con un DataTable contenente due colonne: codice e descrizione. Nel DisplayMember associ la colonna della descrizione mentre nel ValueMember associ la colonna del codice. In questo modo quado ti sposti sulla DGV anche se questa cerca di visualizzare il codice, la combo ti mostrerà il valore della descrizione.

A te la scelta.


Cristian Barca

jekisi Profilo | Senior Member

Se alleghi il progetto, sperando che il db sia un file di Access, te lo modifico in 2 minuti.

lauretta Profilo | Newbie

Ringrazio entrambi per aver risposto e mi scuso se rispondo sono ora, ma mi ero presa qualche giorno di ferie...

Per jekisi
Ti ringrazio per la proposta, il database è MySql. A parte questo vorrei farcela da sola, imparare e capire. Grazie comunque.

Per AntCiar
Adesso riprendo in mano il progetto e vedo cosa riesco a fare. Per la prima cosa che scrivi (togliere il binding) avevo già letto qualcosa facendo una ricerca su google. Per la seconda parte (descrizione su altra tabella) per il punto 1 mi sembra di aver letto che se faccio così poi devo costruirmi a mano le istruzioni per l'inserimento e la modifica dei record, o sbaglio? Per il punto 2 non ci avevo nemmeno pensato, ma in realtà volevo fare una semplice text box e di fianco un pulsantino che apriva un'altra form dove visualizzo tutte le descrizioni e do la possibilità all'utente di selezionarne un'altra.

Per il momento grazie, ora vedo cosa riesco a fare

jekisi Profilo | Senior Member

inserisco:
Cn.Open()
sql = "INSERT INTO [Rddt] (Codice) VALUES(" & Chr(34) & CodiceTextBox.Text & Chr(34) & ")"
cmd = New OleDb.OleDbCommand(sql, Cn)
dr = cmd.ExecuteReader
Cn.Close()
Me.RDdtTableAdapter.Fill(Me.DataSet8.RDdt)
Me.RDdtBindingSource.MoveLast()

Salvo:
Me.RDdtDataGridView.EndEdit.ToString()
CodarticoloTextBox.Select()
Cn.Open()
sql = "UPDATE Rddt SET Qtà=" & Chr(34) & QtàTextBox.Text & Chr(34) & ", Datascadenza=" & Chr(34) & DatascadenzaTextBox.Text.Replace(Chr(34), "''") & Chr(34) & " where IdRiga=" & IDrigaTextBox.Text
cmd = New OleDb.OleDbCommand(sql, Cn)
dr = cmd.ExecuteReader
Cn.Close()

elimino riga selezionata:
Cn.Open()
sql = "Delete * From Rddt where Idriga=" & IDrigaTextBox.Text
cmd = New OleDb.OleDbCommand(sql, Cn)
dr = cmd.ExecuteReader
Cn.Close()
Me.RDdtTableAdapter.Fill(Me.DataSet8.RDdt)
Me.RDdtBindingSource.MoveLast()

Spero ti possa essere d' aiuto
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5