2015-04-22 10 views
5

Ich habe eine GridView und ich führe ein Bulk-Update für nur eine Spalte mit Textfeld. Aber vor dem Update muss ich die Werte dieses Textfelds für die gesamte Gridview überprüfen und wenn die Werte nicht geändert werden, muss ich eine Warnung mit dem Titel "Änderung an Feld für die Aktualisierung vornehmen" angeben.Überprüfen, ob Zeile in gridview geändert

Kann mir jemand einige Optionen vorschlagen?

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

Sie sprechen darüber, den Wert jedes Textfelds in der Gridview zu prüfen oder nur einen einzigen? –

+0

@HarveySpecter - Über alle Textbox Werte in Gridview. – Michael

+0

Ein Ansatz besteht darin, die Daten in Ihre List/DataTable zu laden und jede Zeile zu validieren. –

Antwort

4

Eine viel einfachere Methode wird ein asp:HiddenField zu Ihrem ItemTemplate hinzuzufügen und den Wert für jede Zeile zu vergleichen.

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

Jetzt ist alles, was Sie brauchen, um diesen Wert mit dem Textfeld Wert in jeder Zeile in Code-Behind wie folgt zu vergleichen.

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) 
    { 

    } 
} 

Ich hoffe, der Code ist selbsterklärend.

+0

Danke für die Antwort. Ich glaube, der obige Code hilft, nur Zeilen zu aktualisieren, die geändert wurden. Aber ich muss nur warnen, wenn keine Zeilen in der Gridview geändert werden. – Michael

+0

oh müssen Sie warnen, wenn keine Zeilen geändert werden, und die geänderten Zeilen in allen anderen Fällen speichern? – naveen

+0

ja das ist richtig. Ich muss nur warnen, wenn keine Zeilen geändert werden. – Michael

2

können Sie versuchen, DataGridView.RowValidating Event zu verwenden und überprüfen, ob IsCurrentRowDirty Property

geändert wird

IsCurrentRowDirty Eigenschaft Ruft einen Wert, der angibt, ob die aktuelle Reihe unbestätigten Änderungen hat.

EDIT: -

Die oben genannten Arbeiten in WinForms; in Asp.net gibt es keine solche Methode, Sie müssen die Daten in ein Objekt laden und dann müssen Sie validieren.

können Sie überprüfen Updating Only Changed Rows Using GridView Control

+4

OP gefragt in ASP.Net 'Gridview' nicht in WinForms' DataGridView'. –

0

Verwendung OnRowDataBound Eigentum von gridview. Innen ist es, verwenden:

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

Dies ist 'RowDataBound'. OP fragt nach Bestätigung, bevor 'GridView' wieder bind ist. –

+0

Wird DataControlRowState.Edit nicht nur für rowedit in gridview verwendet, weil ich keine Eigenschaft für die Eigenschaft readrow habe und ich bulkupdate verwende. Bitte korrigieren Sie mich, falls ich falsch liege. – Michael

+0

Ja, mein Fehler. Ich konnte deine Frage nicht verstehen. Aber jetzt mache ich .. – Manu

0

Die grundlegende Sache hier zu tun, um Ihre ursprünglichen Daten in eine DataTable zu laden und dann vergleichen Sie die GridView Reihen, einer nach dem anderen in einer Schleife für diese bestimmte Spalte, die in Ihrem Fall ist die TextBox Spalte. Für die DataTable mit dem GridView zu vergleichen, können Sie so etwas wie dies versuchen:

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. 
     } 
    } 
} 

Hoffnung, das hilft.

0

Laut der Konversation habe ich einige Pseudologik zur Verfügung gestellt. Sie können damit Ihren eigenen Code implementieren.

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) 
     { 

     } 
    } 
Verwandte Themen