2015-04-22 1 views
5

Ho un GridView e sto eseguendo un aggiornamento collettivo per una sola colonna con textbox. Ma prima dell'aggiornamento devo controllare i valori di quella casella di testo per l'intero gridview e se i valori non sono cambiati, devo fornire un avviso che indichi "Apportare modifiche al campo da aggiornare".Controllare se la riga è stata modificata in gridview

Qualcuno mi può suggerire alcune opzioni?

protected void btnUpdate_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      foreach (GridViewRow row in gvDetails.Rows) 
      { 
       string strID = ((Label)row.FindControl("lblID")).Text; 
       string strGroup = ((Label)row.FindControl("lblGrp")).Text; 
       string strValue = ((TextBox)row.FindControl("txtValue")).Text;          
       { 
        //my update query 
       } 
      } 
     } 
     catch (Exception ex) 
     { 

     } 
    } 
+0

Stai parlando di controllare il valore di ogni casella di testo nella griglia o solo uno? –

+0

@HarveySpecter - Informazioni su tutti i valori della casella di testo in griglia. – Michael

+0

Un approccio è Caricare i dati nella tua lista/Tabella dati e convalidare ogni riga. –

risposta

4

Un metodo molto più semplice sarà quello di aggiungere un asp:HiddenField al vostro ItemTemplate e confrontare il valore per ogni riga.

<asp:HiddenField ID="" runat="server" Value='<%# Eval("blah") %>'></asp:HiddenField> 

Ora tutto ciò che serve è quello di confrontare tale valore con il valore casella di testo in ogni riga di codice sottostante come questo.

protected void btnUpdate_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     var isAnyRowUpdated = false; 
     foreach (GridViewRow row in gvDetails.Rows) 
     { 
      string strID = ((Label)row.FindControl("lblID")).Text; 
      string strGroup = ((Label)row.FindControl("lblGrp")).Text; 
      string strValue = ((TextBox)row.FindControl("txtValue")).Text; 
      string strOldValue = ((HiddenField)row.FindControl("hdnOldValue")).Value; 
      if (strValue != strOldValue) 
      { 
       isAnyRowUpdated = true; 
       //update procedure here. 
      } 
     } 
     //now check if the flag is still false 
     //that means no rows are changed 
     if(!isAnyRowUpdated) 
     { 
      //alert no rows are updated 
     } 
    } 
    catch (Exception ex) 
    { 

    } 
} 

Spero che il codice sia auto esplicativo.

+0

Grazie per la risposta. Credo che il codice sopra riportato aiuti ad aggiornare solo le righe che sono state modificate. Ma ho solo bisogno di avvisare se nessuna griglia è stata modificata nella griglia. – Michael

+0

oh è necessario avvisare se nessuna riga viene modificata e salvare le righe modificate in tutti gli altri casi? – naveen

+0

sì sì giusto. Devo solo avvisare se nessuna riga è stata modificata. – Michael

2

Si può provare a utilizzare DataGridView.RowValidating Event e verificare se IsCurrentRowDirty proprietà viene modificata

IsCurrentRowDirty Ottiene un valore che indica se l'attuale riga ha modifiche non.

EDIT: -

Le opere di cui sopra in WinForms; in Asp.net non esiste un tale metodo, devi caricare i dati in un oggetto e quindi devi convalidare.

È possibile controllare Updating Only Changed Rows Using GridView Control

+4

OP chiesto in ASP.Net 'Gridview' non in' DataGridView' di WinForms. –

0

uso onrowdatabound proprietà del GridView. Al suo interno, l'uso:

protected void GridLocation_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
if (e.Row.RowType == DataControlRowType.DataRow && 
    (e.Row.RowState & DataControlRowState.Edit) == DataControlRowState.Edit) 
     { 
     // here you can check your textbox values 
     } 
    } 
+0

Questo è 'RowDataBound'. L'OP sta chiedendo la convalida prima che 'GridView' sia di nuovo vincolante. –

+0

Non è DataControlRowState.Edit utilizzato solo per rowedit in gridview, perché non ho la proprietà editrow e sto usando bulkupdate. Per favore correggimi se sbaglio. – Michael

+0

Sì, mio ​​errore. Non ho capito la tua domanda. Ma ora lo faccio .. – Manu

0

La cosa fondamentale da fare qui per caricare i dati originali in un DataTable e confronta i GridView righe, una per una in un ciclo per quel particolare Colonna, che nel tuo caso è il Colonna TextBox. Per confrontare il DataTable con la GridView, si può provare qualcosa di simile:

foreach (GridViewRow row in Grd.Rows) 
{ 
    TextBox txtAmt = (TextBox)row.FindControl("txtAmount"); 
    string Id = Grd.DataKeys[row.RowIndex].Value.ToString(); 
    for (int i = 0; i < dt.Rows.Count; i++) 
    { 
     if (Id == dt.Rows[i]["ID"].ToString()) 
     { 
     //do your logic here. 
     } 
    } 
} 

Spero che questo aiuti.

0

Come per la conversazione, ho fornito qualche pseudo-logica. È possibile implementare il proprio codice utilizzando questo.

protected void btnUpdate_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      DataTable dt = LoadData(); //Load the data from DB 
      EnumerableRowCollection<DataRow> enumerableDt = dt.AsEnumerable(); 

      foreach (GridViewRow row in gvDetails.Rows) 
      { 
       string strID = ((Label)row.FindControl("lblID")).Text; 
       string strGroup = ((Label)row.FindControl("lblGrp")).Text; 
       string strValue = ((TextBox)row.FindControl("txtValue")).Text; 

       DataRow dr = enumerableDt.Where(x => x.Field<string>("ID") == strID).FirstOrDefault(); //Change your condition accordingly 

       if (dr["Value"].ToString().ToUpper() != strValue.Trim().ToUpper()) //Change your condition here 
       { 
        //Do your updated data logic here 
       } 
       else 
       { 
        //Do your not updated data logic here 
       } 
      } 
     } 
     catch (Exception ex) 
     { 

     } 
    }