using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace InsertUpdateDeleteCombo { public partial class Form1 : Form { DataSet ds = null; SqlDataAdapter adapter = null; BindingSource bsFumetti = null; public Form1() { InitializeComponent(); } private void AccediBtn_Click(object sender, EventArgs e) { // stabilisco una connessione al database //il database è stato messo nella cartella bin\debug, ove si trova anche l'exe SqlConnection connessione = new SqlConnection(@"Data Source=.\SQLEXPRESS;" + @"AttachDbFilename=DBFumetti.mdf" + "Integrated Security=True;User Instance=True"); //DATAADAPTER a cui collegherò la connessione da usare adapter = new SqlDataAdapter("select * from Fumetti", connessione); //COMANDO PER INSERIMENTO DI NUOVI RECORD ************************************** adapter.InsertCommand = new SqlCommand("insert into fumetti (nomeFumetto, costoFumetto, " + "ksGenere, AnnoPubblicazione) values (@nomeFumetto, @costoFumetto, " + "@ksGenere, @AnnoPubblicazione)", connessione); adapter.InsertCommand.Parameters.Add("@nomeFumetto", SqlDbType.VarChar, 50, "NomeFumetto"); adapter.InsertCommand.Parameters.Add("@costoFumetto", SqlDbType.Float, 8, "costoFumetto"); adapter.InsertCommand.Parameters.Add("@ksGenere", SqlDbType.Int, 4, "ksGenere"); adapter.InsertCommand.Parameters.Add("@annoPubblicazione", SqlDbType.Int, 4, "annoPubblicazione"); //******************************************************************************* //COMANDO PER AGGIORNAMENTO RECORD ************************************** adapter.UpdateCommand = new SqlCommand("update Fumetti " + "set nomeFumetto = @nomeFumetto_new, costoFumetto = @costoFumetto_new, " + "ksGenere = @ksGenere_new, AnnoPubblicazione = @AnnoPubblicazione_new " + "where idFumetto = @idfumetto_old and nomeFumetto = @nomeFumetto_old and " + "costoFumetto = @costoFumetto_old and ksGenere = @ksGenere_old and " + "AnnoPubblicazione = @AnnoPubblicazione_old", connessione); //senza specifiche particolari il collegamento tra i parametri è con le colonne attuali sourceVersion = current adapter.UpdateCommand.Parameters.Add("@NomeFumetto_new", SqlDbType.VarChar, 50, "nomeFumetto"); adapter.UpdateCommand.Parameters.Add("@costoFumetto_new", SqlDbType.Float, 8, "costoFumetto"); adapter.UpdateCommand.Parameters.Add("@ksGenere_new", SqlDbType.Int, 4, "ksGenere"); adapter.UpdateCommand.Parameters.Add("@annoPubblicazione_new", SqlDbType.Int, 4, "annoPubblicazione"); //il parametro che corrisponde ai dati originali deve essere appunto collegato alla riga originale //prima delle modifiche, mantenuta dal dataset nell'originalSource SqlParameter p = adapter.UpdateCommand.Parameters.Add("@idFumetto_old", SqlDbType.Int, 4, "idFumetto"); p.SourceVersion = DataRowVersion.Original; p = adapter.UpdateCommand.Parameters.Add("@nomeFumetto_old", SqlDbType.VarChar, 50, "nomeFumetto"); p.SourceVersion = DataRowVersion.Original; p = adapter.UpdateCommand.Parameters.Add("@costoFumetto_old", SqlDbType.Float, 8, "costoFumetto"); p.SourceVersion = DataRowVersion.Original; p = adapter.UpdateCommand.Parameters.Add("@ksGenere_old", SqlDbType.Int, 4, "ksGenere"); p.SourceVersion = DataRowVersion.Original; p = adapter.UpdateCommand.Parameters.Add("@AnnoPubblicazione_old", SqlDbType.Int, 4, "AnnoPubblicazione"); p.SourceVersion = DataRowVersion.Original; //******************************************************************************************************** //COMANDO PER ELIMINAZIONE RECORD ************************************** adapter.DeleteCommand = new SqlCommand("delete from Fumetti " + "where idFumetto = @idfumetto_old and nomeFumetto = @nomeFumetto_old and " + "costoFumetto = @costoFumetto_old and ksGenere = @ksGenere_old and " + "AnnoPubblicazione = @AnnoPubblicazione_old", connessione); p = adapter.DeleteCommand.Parameters.Add("@idFumetto_old", SqlDbType.Int, 4, "idFumetto"); p.SourceVersion = DataRowVersion.Original; p = adapter.DeleteCommand.Parameters.Add("@nomeFumetto_old", SqlDbType.VarChar, 50, "nomeFumetto"); p.SourceVersion = DataRowVersion.Original; p = adapter.DeleteCommand.Parameters.Add("@costoFumetto_old", SqlDbType.Float, 8, "costoFumetto"); p.SourceVersion = DataRowVersion.Original; p = adapter.DeleteCommand.Parameters.Add("@ksGenere_old", SqlDbType.Int, 4, "ksGenere"); p.SourceVersion = DataRowVersion.Original; p = adapter.DeleteCommand.Parameters.Add("@AnnoPubblicazione_old", SqlDbType.Int, 4, "AnnoPubblicazione"); p.SourceVersion = DataRowVersion.Original; //******************************************************************************************************** //DATASET *************************************************************************** ds = new DataSet(); //leggo i dati della prima tabella che interessa nel dataSet adapter.Fill(ds, "Fumetti"); //leggo anche l'elenco dei generi (la prima tabella resta nel dataset ...) adapter.SelectCommand.CommandText = "select * from generi"; adapter.Fill(ds, "Generi"); // ********************************************************************************** //BINDING SOURCE per i fumetti e per i generi ***************************************** bsFumetti = new BindingSource(); bsFumetti.DataSource = ds; bsFumetti.DataMember = "Fumetti"; //tabella da gestire //binding source per i generi (serve per comboBox scelta generi) //forma compatta di creazione di un bindingsource BindingSource bsGeneri = new BindingSource(ds, "Generi"); // ************************************************************************************* //DATAGRIDVIEW ************************************************************************* DataGridView grid = new DataGridView(); //posizione in cui apparirà sul form grid.Left = 10; grid.Top = 220; //dimensioni grid.Width = 300; grid.DataSource = bsFumetti; //aggiungiamo il grid sulla form this.Controls.Add(grid); // ************************************************************************************** //aggiungiamo una colonna combobox per la scelta di ksGenere DataGridViewComboBoxColumn comboBoxColumn = new DataGridViewComboBoxColumn(); comboBoxColumn.DataSource = bsGeneri; comboBoxColumn.DataPropertyName = "ksGenere"; comboBoxColumn.DisplayMember = "descGenere"; comboBoxColumn.ValueMember = "idGenere"; grid.Columns.Add(comboBoxColumn); //eliminiamo la colonna ksGenere numerica grid.Columns.Remove("ksGenere"); //BINDING NAVIGATOR ********************************************************************* //(non indispensabile in quanto potremmo realizzare noi una interfaccia per usare il datagrid BindingNavigator navigator = new BindingNavigator(true); //il navigator in partenza non ha il bottone per salvare, aggiungiamolo: //a) creiamo prima il bottone collegandolo ad una icona gif ToolStripButton SaveBtn = new ToolStripButton(new Bitmap("diskette.gif")); //b) aggiungiamo un metodo all'elenco degli handler per il click del bottone // nota: il metodo è scritto in seguito SaveBtn.Click += new EventHandler(SaveBtn_Click); //c) aggiungiamo il bottone alla toolstrip navigator.Items.Add(SaveBtn); //indichiamo al navigator quale binding source controllare navigator.BindingSource = bsFumetti; //infine aggiungiamo il navigator alla form this.Controls.Add(navigator); //************************************************************************************** //SCHEDA A CAMPI SINGOLI (di solito in alternativa al gridview ...) //nome fumetto ****************** TextBox nomeFumetto = new TextBox(); //associo la colonna del binding source (e quindi della tabella) //alla proprietà Text del textbox (cioè il contenuto della casella //diventa quello del campo della tabella nomeFumetto.DataBindings.Add("Text", bsFumetti, "nomeFumetto"); nomeFumetto.Top = 50; nomeFumetto.Left = 10; this.Controls.Add(nomeFumetto); // ****************************** //costo fumetto TextBox costoFumetto = new TextBox(); costoFumetto.DataBindings.Add("Text", bsFumetti, "costoFumetto"); costoFumetto.Top = 50; costoFumetto.Left = 120; this.Controls.Add(costoFumetto); // ****************************** //ksGenere (in previsione di mettere una combo, saltare) TextBox ksGenere = new TextBox(); ksGenere.DataBindings.Add("Text", bsFumetti, "ksGenere"); ksGenere.Top = 50; ksGenere.Left = 240; this.Controls.Add(ksGenere); // ****************************** //anno pubblicazione TextBox annoPubblicazione = new TextBox(); annoPubblicazione.DataBindings.Add("Text", bsFumetti, "annoPubblicazione"); annoPubblicazione.Top = 50; annoPubblicazione.Left = 360; this.Controls.Add(annoPubblicazione); // ****************************** //COMBOBOX per i generi **************************** ComboBox GenereCombo = new ComboBox(); GenereCombo.Top = 100; GenereCombo.Left = 10; this.Controls.Add(GenereCombo); GenereCombo.DataBindings.Add("SelectedValue", bsFumetti, "ksGenere"); GenereCombo.DataSource = bsGeneri; GenereCombo.DisplayMember = "descGenere"; GenereCombo.ValueMember = "idGenere"; // ************************************************* //******* FINE SCHEDA CAMPI SINGOLI ********************************************** } void SaveBtn_Click(object sender, EventArgs e) { this.Validate(); this.bsFumetti.EndEdit(); this.adapter.Update(ds.Tables["Fumetti"]); } } }