私は数字を入力する列を持つGridViewを持っています。 Javascriptは、これらの数値を入力するときにこれらの数値を合計し、GridView外のラベルに合計を表示します。正常に動作します。ASP.NET GridViewのJavascript値がポストバック間で失われました
ページ上には、クリックするとポストバックが発生するボタンがあります。また、合計ラベルの値を失わないために、Javascriptは合計をHiddenFieldに保存し、page_loadにはHiddenFieldをTotalラベルに戻します。それも動作します。
しかし、私がポストバックから戻って、いずれかのセルに数値を入力した場合、合計はその数値がにしか反映されず、他のすべてのセルの値は無視されます。それらはポストバックの間に失われます。
私はJavaScriptがTotalラベルだけでなく、その列にあるすべてのセルの値を保持するべきだと思うが、私のJSの知識は今のところはゼロに近い。
マイ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>
マイ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>
私のC#のコードビハインド:
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";
}
私はちょうどコピーしているため(Javascriptがおそらくひどく非効率的かつ厄介です私は本当にそれを理解することなくネット上で見つけることができます。そのコード上の任意の発言は非常に有益だろう私にも)。
EDIT:
このページは、ユーザー(レシートを生成するもの)GridViewの行の適切なセルに1つ以上の数字を入力しますレシートとして終わることを意図し、そしてアプリケーションがこれらを合計する必要があります数字を入力すると、ユーザーは数字を入力するとその合計を見ることができます。その行には、より多くの情報を含む行があります。このQを開くために最小限に簡略化しました。
(コード中の「数量」という用語は誤解を招き、「Payed」に変更しました)また、@ Fnostroが示唆したように、私はUpdatePanel
をページ)。
これは私が最初に得るものです:
私はその後、1行目で45を入力し、私はそれを入力すると、私は45に更新されている合計が、私は30を入力し、合計がすぐに75に更新されて参照してください。
私は、ボタンをクリックして、入手:
は今、私も最後の行にカーソルを置き、5を入力して、合計のショー5。 Javascriptは他の2つの値を無視します:
私は今、より明確になり、助けていただければ幸いです。
私はjQueryに慣れていませんが、あなたの質問に対する答えはこの記事にあります:http://stackoverflow.com/questions/256195/jquery-document-ready-and-updatepanels – ConnorsFan
@ConnorsFan - ありがとう4リンク。私の質問を投稿する前にそれを試してみましたが、それは助けになりませんでした。 – gadi
fnostroの答えに関連する質問:それはUpdatePanelなしでも機能しますか?そして、ちょうど確かめてください:ポストバック後のフィールドは空白ですか、または合計の計算で無視されますか? – ConnorsFan