Ich habe ein GridView mit einer Spalte, wo ich Zahlen eingeben. Ein Javascript summiert diese Zahlen, während ich sie eintippe, und zeigt die Summe in einem Label außerhalb der GridView an. Funktioniert gut.ASP.NET Javascript Werte in GridView verloren zwischen Postbacks
Irgendwo auf der Seite gibt es eine Schaltfläche, die ein Postback verursacht, wenn geklickt wird, und um den Wert der Gesamtbeschriftung nicht zu verlieren, speichert das Javascript auch die Summe in einem HiddenField, und auf page_load kopiere ich es aus dem HiddenField zurück zum Total Label. Das funktioniert auch.
Aber wenn ich nach dem Postback zurück bin und ich eine Zahl in einer der Zellen eintippe, würde die Summe nur diese Nummer widerspiegeln und die Werte in allen anderen Zellen ignorieren. Diese sind zwischen Postbacks verloren.
Ich denke, das Javascript sollte nicht nur die Total-Label, sondern alle Werte aller Zellen in dieser Spalte, aber mein Wissen über JS ist nahe bei Null (vorerst ...).
Mein HTML:
<table>
<tr>
<td>
<asp:Button ID="btn" runat="server" OnClick="btn_Click" Text="Click me" />
<asp:Label ID="lbl_Message" runat="server"></asp:Label>
</td>
</tr>
<tr>
<td>
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="Something" HeaderText="Something" />
<asp:TemplateField HeaderText="Payed">
<ItemTemplate>
<asp:TextBox ID="txb_Payed" runat="server"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderStyle-CssClass="myHidden" ItemStyle-CssClass="myHidden">
<ItemTemplate>
<asp:Label ID="lbl_Temp_Payed" runat="server" Text="0"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Grand Total:
<asp:Label ID="lbl_Grand_Total" runat="server" Text="0"></asp:Label>
<asp:HiddenField ID="hdf_Keep_Total" runat="server" />
</div>
</td>
</tr>
</table>
Mein Javascript:
<script type="text/javascript">
$("[id *= txb_Payed]").live("change", function() {
if (isNaN(parseInt($(this).val()))) {
$(this).val('0');
} else {
$(this).val(parseInt($(this).val()).toString());
}
});
$("[id *= txb_Payed]").live("keyup", function() {
if (!jQuery.trim($(this).val()) == '') {
if (!isNaN(parseFloat($(this).val()))) {
var row = $(this).closest("tr");
$("[id *= lbl_Temp_Payed]", row).html(parseFloat($(this).val()));
}
} else {
$(this).val('');
}
var my_Total = 0;
$("[id *= lbl_Temp_Payed]").each(function() {
my_Total = my_Total + parseFloat($(this).html());
});
$("[id *= lbl_Grand_Total]").html(my_Total.toString());
var my_hdf_Keep_Total = '<%= hdf_Keep_Total.ClientID %>';
document.getElementById(my_hdf_Keep_Total).value = my_Total;
});
</script>
Mein C# -Code-behind:
protected void Page_Load(object sender, EventArgs e)
{
lbl_Grand_Total.Text = hdf_Keep_Total.Value;
if (!Page.IsPostBack)
{
Bind_Sample_Data_To_Grid();
}
}
private void Bind_Sample_Data_To_Grid()
{
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[1] { new DataColumn("Something") });
dt.Rows.Add("aaaaa");
dt.Rows.Add("bbbbb");
dt.Rows.Add("ccccc");
GridView1.DataSource = dt;
GridView1.DataBind();
}
protected void btn_Click(object sender, EventArgs e)
{
lbl_Message.Text = "U clicked";
}
(Die Javascript wahrscheinlich schrecklich ineffizient und chaotisch ist, weil ich einfach kopieren Dinge, die ich im Internet finde, ohne es wirklich zu verstehen. Jede Bemerkung zu diesem Code wäre sehr nützlich für mich auch).
EDIT:
Diese Seite soll, als Quittung enden, wo der Benutzer (die den Empfang der Herstellung) eine oder mehrere Zahlen in der richtigen Zelle in der Grid Zeile eingeben wird, und die Anwendung muss diese summieren Zahlen, damit der Benutzer die Summe sehen kann, während er die Zahlen eintippt. In der Zeile wird es mehr Zeilen mit mehr Informationen geben. Ich habe es auf das Minimum zum Zweck der Eröffnung dieser Q.
(der Begriff "Menge" im Code war irreführend und ich änderte es in "Payed". Auch, wie @Fnostro vorgeschlagen, nahm ich die UpdatePanel
aus der Seite).
Dies ist, was ich zuerst bekommen:
I 45 dann in der ersten Zeile eingeben und wie ich es eingeben Ich sehe die Gesamt I 30 eingeben, um 45 aktualisiert werden und die Gesamt aktualisiert wird sofort auf 75:
ich dann auf den Button, und erhalten:
Jetzt lege ich den Cursor auf die letzte Zeile, und geben Sie 5 und die Gesamt zeigt 5 auch. Das Javascript ignoriert die anderen beiden Werte:
Ich hoffe, ich war jetzt klarer und würde jede Hilfe zu schätzen wissen.
Ich bin nicht sehr vertraut mit jQuery, aber ich denke, dass die Antwort auf Ihre Frage in diesem Beitrag ist: http://StackOverflow.com/Questions/256195/Jquery-Document-Ready-and-Updatepanels – ConnorsFan
@ConnorsFan - danke 4 der Link. Ich habe es versucht, bevor ich meine Frage gepostet habe, aber das hat nicht geholfen. – gadi
Frage zu fnostro Antwort: funktioniert es ohne das UpdatePanel? Und nur um sicher zu sein: Sind die Felder nach dem Postback leer oder werden sie bei der Berechnung der Summe ignoriert? – ConnorsFan