2016-11-07 10 views
0

ポストバック後にjavascriptから設定された値がクリアされていますが、setdataボタンのクライアントクリックからgridviewプロセスカラムに値を設定していますが、startカラムのボタンがclickeの場合、クリアされました。以下のコードを参照して解決策を提案してください。javascriptのデータセットがポストバック後にクリアされる

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 

    <!DOCTYPE html> 

    <html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
<title></title> 
<script type="text/javascript"> 

    function SetData(name, name2) { 
     document.getElementById(name).innerHTML = 'data.d.Name'; 
     document.getElementById(name2).innerHTML = 'data.d.Name2'; 
    } 
    </script> 
</head> 
<body> 
<form id="form1" runat="server"> 
    <asp:ScriptManager ID="ScriptManager1" runat="server"> 
    </asp:ScriptManager> 
    <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
    <div> 
    <asp:GridView ID="gvMonitoring" runat="server" Width="100%" AllowPaging="false" PageSize="10" 
          AutoGenerateColumns="false" DataKeyNames="Id" 
          EnableViewState="true" OnRowDataBound="gvMonitoring_OnRowDataBound"> 
          <Columns> 
           <asp:TemplateField HeaderText="Name"> 
            <ItemTemplate> 
             <asp:Label ID="lblName" runat="server" Text='<%# Bind("Name") %>'></asp:Label> 
            </ItemTemplate> 
           </asp:TemplateField> 
            <asp:TemplateField HeaderText="Name 2"> 
            <ItemTemplate> 
             <asp:Label ID="lblName2" runat="server" EnableViewState="True" ></asp:Label> 
            </ItemTemplate> 
           </asp:TemplateField> 
           <asp:TemplateField HeaderText="Set Data"> 
            <ItemTemplate> 
             <asp:Button ID="btnSetData" runat="server" Text="Set Data" /> 
            </ItemTemplate> 
           </asp:TemplateField> 
           <asp:TemplateField HeaderText="Start"> 
            <ItemTemplate> 
             <asp:Button ID="btnStartTime" runat="server" Text="Postback" /> 
            </ItemTemplate> 
           </asp:TemplateField> 
          </Columns> 
         </asp:GridView> 

</div> 
    </ContentTemplate> 

    </asp:UpdatePanel> 
    </form> 
    </body> 
</html> 

using System; 
using System.Collections.Generic; 
using System.Web.UI.WebControls; 

public partial class ProcessDetail 
{ 
    public long Id { get; set; } 
    public string Name { get; set; } 
} 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
     var details = new List<ProcessDetail>(); 
     for (var i = 1; i <= 5; i++) 
     { 
      details.Add(new ProcessDetail() { Name = "Process " + i}); 
     } 
     gvMonitoring.DataSource = details; 
     gvMonitoring.DataBind(); 
    } 
    } 

    protected void gvMonitoring_OnRowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      var lblName = ((Label)e.Row.FindControl("lblName")); 
      var lblName2 = ((Label)e.Row.FindControl("lblName2")); 

     ((Button)e.Row.FindControl("btnSetData")).Attributes.Add("onclick", string.Format("SetData('{0}','{1}');return false;",                        lblName.ClientID, lblName2.ClientID)); 

     } 
    } 
} 
+2

ポストバック後にデータがjsに残ることはありません – Imad

+0

したがって、状態を保存して再作成するか、またはajaxを使用してページを更新する必要があります。 – epascarello

+0

私はajaxの更新パネルを使用しようとしましたが、値はクリアされます。 – user6634447

答えて

0

@Imadを明確にするために、ポストバックは完全なページリロードです。したがって、javascriptがあれば、それも再読み込みされます。あなたが保存した値はすべて消去されます。あなたがウェブフォームとjavascriptを混ぜなければならない場合は、私がお勧めする2つの方法があります。

1)あなたのjavascriptはajax呼び出しと更新コントロールを使用する必要があります。完全な保存時にのみポストバックを使用します。あなたがフォームを持っていて、それが誰かの名前/アドレスを取る場合、意味します。私はajaxを通じてデータを検証します。そして、それがすべて正しい場合、私は保存のためにポストバックをトリガーします。

2)保存する必要がある重要なvarを保持するいくつかの隠しフィールドを作成し、サーバータグ<%= =>を使用してそれらにアクセスします。この方法はかなりひどいですが、それはできます。

+0

私はajaxの更新パネルを使用しようとしましたが、値はクリアされます。 – user6634447

+0

あなたがAJAX Update Panalを使用していても、ポストバックしても、あなたのjavascriptを拭き取るつもりです。それがウェブフォームの本質です。あなたのJavaScriptは、ポストバックに生き残ることは決してありません。ポストバックを削除するか、ポストバックを回避する必要があります。 – gh9

関連する問題