Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 31
  1. #1
    Utente di HTML.it L'avatar di ciupaz
    Registrato dal
    Dec 2000
    residenza
    Milano
    Messaggi
    848

    Nuovo record in Datagrid

    Ciao a tutti,
    non sto riuscendo a far inserire un nuovo record in un datagrid.
    Il datagrid è semplice, mostra gli utenti di un database, e ne permette la modifica e la cancellazione.
    Tramite un pulsante esterno, riesco a far inserire una nuova riga vuota nella griglia, in modo che l'utente possa digitare i nuovi valori.
    Alla pressione del Update (il linkbutton di default) non succede però proprio niente, e mi si rimostra il datagrid originale.
    Il codice che sto usando è il seguente:

    private void btnNewUser_Click(object sender, System.EventArgs e)
    {
    try {
    string data = DateTime.Now.ToString();
    DataRow dr = dsUsers1.USERS.NewRow();
    dr["name"] = "(New)" + data;
    dr["surname"] = "";
    dr["email"] = "";
    dr["userid"] = "";
    dr["note"] = "";

    dsUsers1.USERS.Rows.InsertAt(dr,0);
    DataGrid1.EditItemIndex = 0;
    Popola();
    }
    catch (Exception ex)
    {Label2.Text = ex.Message; }

    }

    private void Popola()
    {
    sqlDataAdapter1.Fill(dsUsers1);
    DataGrid1.DataBind();

    }

    La tabella si chiama appunto USERS ed è composta dai campi:

    CREATE TABLE [sarbox].[USERS] (
    [id_user] [int] IDENTITY (1, 1) NOT NULL ,
    [name] [varchar] (200),
    [surname] [varchar] (200),
    [email] [varchar] (200) ,
    [userid] [varchar] (200) ,
    [note] [varchar] (4000) ,
    [insert_date] [datetime] NULL
    ) ON [PRIMARY]

    Qualcuno ha idea del perchè non funziona?
    Grazie davvero

  2. #2
    Utente di HTML.it L'avatar di edaje
    Registrato dal
    Jul 2003
    Messaggi
    363
    dopo questa istruzione ti manca l'aggiornamento del database

    -Devi aprire una connessione
    -Fare la select al dataset
    -utilizzare sqlcommanbuilder per ricostruire il comando di insert
    -eseguire il metodo update del dataset

  3. #3
    Originariamente inviato da edaje
    -Devi aprire una connessione
    xche'? se usi un dataadapter la connessione ci pensa lui ad aprirla
    -Fare la select al dataset
    -utilizzare sqlcommanbuilder per ricostruire il comando di insert
    Il commandbuilder non e' che sia una gran idea usarlo. Poi, visto che stiamo parlando di un unico record da inserire forse sarebbe meglio usare un command creato ad hoc.
    -eseguire il metodo update del dataset
    update e' un metodo del dataadapter
    Saluti a tutti
    Riccardo

  4. #4
    Utente di HTML.it L'avatar di ciupaz
    Registrato dal
    Dec 2000
    residenza
    Milano
    Messaggi
    848
    E quindi, come risolvo la situazione?

  5. #5
    Come ti ha detto edaje, ti manca la procedura che provvede a gestire il click sul bottone update della datagrid (onUpdateCommand). Se non crei questa procedura per forza che non succede niente. Dentro la procedura ci metti il codice con cui prendi i dati della riga modificata (o aggiunta) e li metti nel db dopo di che ricarichi la datagrid.
    Alla prima rapida ricerca su msdn ti ho trovato questo articolo ma ce ne sono quintalate
    http://tinyurl.com/d6u2w
    Saluti a tutti
    Riccardo

  6. #6
    Utente di HTML.it L'avatar di ciupaz
    Registrato dal
    Dec 2000
    residenza
    Milano
    Messaggi
    848
    Ciao, ovviamente ho il metodo di Update, è questo:

    private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {

    SqlCommand updCommand = new SqlCommand();
    SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);
    string nameText, surnameText, emailText, useridText, noteText;
    int id_user = (int)DataGrid1.DataKeys[e.Item.ItemIndex];
    nameText = ((TextBox)e.Item.Cells[3].Controls[0]).Text;
    surnameText = ((TextBox)e.Item.Cells[4].Controls[0]).Text;
    emailText = ((TextBox)e.Item.Cells[5].Controls[0]).Text;
    useridText = ((TextBox)e.Item.Cells[6].Controls[0]).Text;
    noteText = ((TextBox)e.Item.Cells[7].Controls[0]).Text;

    updCommand.CommandText = "UPDATE USERS SET name = '" +
    nameText + "', surname = '" +
    surnameText + "', email = '" +
    emailText + "', userid = '" +
    useridText + "', note = '" +
    noteText + "'"
    + " WHERE id_user = '" +
    id_user + "'";

    updCommand.CommandType = CommandType.Text;
    updCommand.Connection = conn;
    conn.Open();
    updCommand.ExecuteNonQuery();
    DataGrid1.DataBind();
    DataGrid1.EditItemIndex = -1;
    conn.Close();
    Popola();
    }

    e funziona correttamente nel caso della modifica di una riga esistente.
    Il problema è che non compie nessuna operazione quando deve invece inserire la nuova riga, come nel mio caso.

  7. #7
    Originariamente inviato da ciupaz
    Ciao, ovviamente ho il metodo di Update, è questo:
    ovviamente non si capiva che ce l'avevi ed e' l'unico che non hai postato all'inizio e che serve per la tua richiesta.
    updCommand.CommandText = "UPDATE USERS SET name = '" +
    nameText + "', surname = '" +
    surnameText + "', email = '" +
    emailText + "', userid = '" +
    useridText + "', note = '" +
    noteText + "'"
    + " WHERE id_user = '" +
    id_user + "'";
    VVoVe: argh... mai sentito parlare dei parametri? Dovresti usarli invece di incollare stringhe di testo nella query.
    Cmq, per il problema che segnali, non dovrai fare altro che usare una qualche logica che, prima di usare il command, scelga di aggiornare ("update ....") oppure inserire ("insert into...") il record.
    Quindi potresti usare il fatto che quando crei la riga vuota magari metti un -1 in qualche campo (es. id) e poi nella procedura se c'e' -1 e' un insert altrimenti e' un update (oppure metti in una session "Insert" nel momento che l'utente aggiunge un nuovo record e ripulisci la sessione finita la procedura di inserimento oppure se annullata.)
    Saluti a tutti
    Riccardo

  8. #8
    Utente di HTML.it L'avatar di ciupaz
    Registrato dal
    Dec 2000
    residenza
    Milano
    Messaggi
    848
    Grazie Riccardo, ora provo come mi hai detto.
    Sì in effetti usare la concatenazione di stringhe non è un bel vedersi.
    Vedo un po' anche di metterci dei parametri.

  9. #9
    Utente di HTML.it L'avatar di ciupaz
    Registrato dal
    Dec 2000
    residenza
    Milano
    Messaggi
    848
    L'ho riscritto così fatto, in modo da utilizzare i parametri:

    private void DataGrid1_UpdateCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
    {

    SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionString"]);

    string name, surname, email, userid, note;

    int id_user = (int)DataGrid1.DataKeys[e.Item.ItemIndex];
    TextBox tb;
    tb = (TextBox)e.Item.Cells[3].Controls[0];
    name = tb.Text;
    tb = (TextBox)e.Item.Cells[4].Controls[0];
    surname = tb.Text;
    tb = (TextBox)e.Item.Cells[5].Controls[0];
    email = tb.Text;
    tb = (TextBox)e.Item.Cells[6].Controls[0];
    userid = tb.Text;
    tb = (TextBox)e.Item.Cells[7].Controls[0];
    note = tb.Text;

    SqlCommand updCommand = new SqlCommand("up_UserUpdate",conn);
    updCommand.CommandType = CommandType.StoredProcedure;

    updCommand.Parameters.Add(new SqlParameter("@id_user", SqlDbType.Int));
    updCommand.Parameters.Add(new SqlParameter("@name", SqlDbType.VarChar,200));
    updCommand.Parameters.Add(new SqlParameter("@surname", SqlDbType.VarChar,200));
    updCommand.Parameters.Add(new SqlParameter("@email", SqlDbType.VarChar,200));
    updCommand.Parameters.Add(new SqlParameter("@userid", SqlDbType.VarChar,200));
    updCommand.Parameters.Add(new SqlParameter("@note", SqlDbType.VarChar,4000));

    updCommand.Parameters["@id_user"].Value = id_user;
    updCommand.Parameters["@name"].Value = name;
    updCommand.Parameters["@surname"].Value = surname;
    updCommand.Parameters["@email"].Value = email;
    updCommand.Parameters["@userid"].Value = userid;
    updCommand.Parameters["@note"].Value = note;

    conn.Open();
    updCommand.ExecuteNonQuery();
    DataGrid1.DataBind();
    DataGrid1.EditItemIndex = -1;
    conn.Close();
    Popola();
    }

    dove il metodo Popola() è:

    private void Popola()
    {
    sqlDataAdapter1.Fill(dsUsers1);
    DataGrid1.DataBind();
    }

    Non sono ancora riuscito però nel mio intento di fargli inserire un record nuovo

  10. #10
    Originariamente inviato da ciupaz
    conn.Open();
    updCommand.ExecuteNonQuery();
    DataGrid1.DataBind();
    DataGrid1.EditItemIndex = -1;
    conn.Close();
    Popola();
    }
    dove il metodo Popola() è:
    private void Popola()
    {
    sqlDataAdapter1.Fill(dsUsers1);
    DataGrid1.DataBind();
    }
    metti l'esecuzione del command all'interno di un blocco try in modo da essere sicuro che in caso di errore la connessione venga chiusa.
    codice:
    try
    {
    conn.Open();
    updCommand.ExecuteNonQuery();
    } finally 
    {
    conn.Close();
    }
    poi, se chiami alla fine una sub (popola) che aggiorna la datagrid non chiamare nella funzione updatecommand le stesse cose due volte.
    Detto questo, cosi come hai scritto il codice per modificare scrivi anche quello per inserire e nella sub onupdatecommand se una certa condizione e' vera esegui quello per modificare (che hai gia' scritto) oppure quello per inserire. La condizione per procedere all'inserimento puo' essere il fatto che l'id_user e' -1 mentre quella per la modifica che lo stesso id_user sia >= 0. Il codice per l'insert e' uguale a quello per l'update cambia solo la stored procedure che userai e senza il parametro id_user (che penso venga assegnato dal db).
    Saluti a tutti
    Riccardo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.