2010-03-12 4 views
8

Ich habe die GridView unten. Ich bin an eine benutzerdefinierte Datenquelle im Code gebunden. Es kommt gut in das "OnRowUpdating" -Ereignis, aber es gibt keine NewValues ​​oder OldValues. Irgendwelche Vorschläge, wie ich diese Werte bekommen kann?GridViews NewValues ​​und OldValues ​​leer im OnRowUpdating-Ereignis

<asp:GridView ID="gv_Personnel" 
         runat="server" 
         OnRowDataBound="gv_Personnel_DataBind" 
         OnRowCancelingEdit="gv_Personnel_CancelEdit" 
         OnRowEditing="gv_Personnel_EditRow" 
         OnRowUpdating="gv_Personnel_UpdateRow" 
         AutoGenerateColumns="false" 
         ShowFooter="true" 
         DataKeyNames="BudgetLineID" 
         AutoGenerateEditButton="true" 
         AutoGenerateDeleteButton="true" 
         > 
      <Columns>     
       <asp:BoundField HeaderText="Level of Staff" DataField="LineDescription" /> 
       <%--<asp:BoundField HeaderText="Hrs/Units requested" DataField="NumberOfUnits" />--%> 
       <asp:TemplateField HeaderText="Hrs/Units requested"> 
        <ItemTemplate> 
         <%# Eval("NumberOfUnits")%> 
        </ItemTemplate> 
        <EditItemTemplate> 
         <asp:TextBox ID="tb_NumUnits" runat="server" Text='<%# Bind("NumberOfUnits")%>' /> 
        </EditItemTemplate> 
       </asp:TemplateField> 
       <asp:BoundField HeaderText="Hrs/Units of Applicant Cost Share" DataField="" NullDisplayText="0" /> 
       <asp:BoundField HeaderText="Hrs/Units of Partner Cost Share" DataField="" NullDisplayText="0" /> 
       <asp:BoundField FooterStyle-Font-Bold="true" FooterText="TOTAL PERSONNEL SERVICES:" HeaderText="Rate" DataFormatString="{0:C}" DataField="UnitPrice" /> 
       <asp:TemplateField HeaderText="Amount Requested" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/> 
       <asp:TemplateField HeaderText="Applicant Cost Share" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/> 
       <asp:TemplateField HeaderText="Partner Cost Share" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/> 
       <asp:TemplateField HeaderText="Total Projet Cost" ItemStyle-HorizontalAlign="Right" FooterStyle-HorizontalAlign="Right" FooterStyle-BorderWidth="2" FooterStyle-Font-Bold="true"/> 
      </Columns> 
     </asp:GridView> 

Antwort

4

In Bezug auf das RowUpdating Ereignisse Problem der Gridview-Steuerelement, das das ist erwartete Verhalten, denn wenn wir nicht Grid assoziieren (oder andere ASP.NET 2.0 Databound-Steuerung) mit Datasource-Steuerelement, hat es 't automatisch abfragen und füllen Sie die Parameter Sammlung der updating/deleting/... Ereignisse. In solchen Fällen müssen wir die Feldwerte manuell aus dem Template extrahieren.

Dies ist, was ein Microsoft-Mitarbeiter in here sagt.

In diesem Fall können Sie mit der Methode ExtractValuesFromCell die NewValues-Sammlung selbst erstellen.

EDIT:

ich ein Stück Code in den Kommentaren der this Blog gefunden:

protected void OnRowEditing(object sender, GridViewEditEventArgs e) 
{  
     GridView gv = (GridView)sender; 
     gv.EditIndex = e.NewEditIndex; 
     gv.DataBind(); 
     ... 
} 

protected void OnRowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    GridView gv = (GridView)sender; 
    for (int i = 0; i < gv.Columns.Count; i++) 
    { 
     DataControlFieldCell cell = gv.Rows[e.RowIndex].Cells[i] as DataControlFieldCell; 
     gv.Columns[i].ExtractValuesFromCell(e.NewValues, cell, DataControlRowState.Edit, true); 
    } 
    // now you can use NewValues collection normally 
} 

Havent getestet, aber scheint das Problem zu lösen, lassen Sie mich wissen, wenn es so wäre.

+0

versuche e.Keys statt gv.Columns [i] .ExtractValuesFromCell (e.NewValues, Zelle, – ONYX

5

Ich bin nicht sicher, ob dies das help..but würde ist, was ich in Msdn site

Die Keys, OldValues ​​und NewValues ​​Sammlungen nur werden automatisch bevölkert gefunden, wenn die Gridview-Steuerelement an Daten gebunden ist mithilfe der DataSourceID -Eigenschaft.

+0

Also sagen Sie, dass diese Werte nur verwendet werden können, wenn Sie eine Datenquelle auf der aspx-Seite definieren und verwenden? –

+0

Ich bin mir nicht sicher, ob ich es nicht versucht habe, aber die Anweisung besagt, dass Sie die DataSourceID -Eigenschaft beim Binden mit GridView verwenden müssen. Ich könnte das versuchen und sehen, ob Sie einer Datenquelle eine ID zuweisen und sie in Code binden können.Wenn nicht, versuche ich den Vorschlag unten =) – hallie

1

Ich machte Datenbindung in meinem Page_Load -Ereignis und als ich auf "Update" klickte, war das PostBack fertig, also wurde das Page_Load -Ereignis ausgelöst. GridView wurde wieder mit den alten Werten gefüllt, daher konnte ich im myGrid.RowUpdating-Ereignis keine neuen Werte abrufen. Wenn das hilft

0

Sie müssen die IsPostback im Formular laden überprüfen. Wenn das Update der Gridview das Postback durchgeführt hat, wurde es zuerst mit den alten Werten aktualisiert. Verwenden Sie IsPostBack um dies zu verhindern:

If Not IsPostback Then 

    ' Data bind here 

End If 

Auf diese Weise wird es nicht die "neue" gridview Werte

+1

Dies erklärt nicht, warum * alte Werte * null sind und daher nicht die Lösung ist Aber es ist ein häufiger Fehler, das Netz wieder zu binden. – MetalPhoenix

1

Bind in der Seite PreRender Ereignishandler wie folgt überschrieben:

Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender 
    GridBinder() 
End Sub 

NB: PreRender findet nach dem Ereignis RowUpdating statt.