如:网面中有一绑定后的datagrid生成代码如下
<table>
<tr>
 <td>第一行</td>
  <td>
      <input type="button" value="隐藏" onclick="GoShowDetail(this,2);" />
 </td>
</tr>
<tr>
 <td>第二行
  </td>
</tr>
</table>
 function GoShow(btn,i)
 {
    var tr = btn.parentElement.parentElement.nextSibling;    
    tr.style.display = (i==1)?"":"none";
 }
点击"button"隐藏后隐藏了第二行
但当执行了后台事件的时候"第二行"又显示出来了我想问一下有没有什么方法让页面保持我那一次的javascript操作;也就是点击了其他后台事件“第二行”也就隐藏的谢谢

解决方案 »

  1.   

    比较麻烦,或者改用服务器端的隐藏(打开AJAX后可能效果差不多)
    或者在GoShow里对另一个隐藏域赋值做标识,执行服务器端事件的同时接收这个隐藏域的值(Request.Form),然后根据这个值重新生成一个datagrid或者生成一个JS脚本在客户端加载完毕后改变标记行的状态
    怎么做都麻烦,不好做啊,也可能是我没想出好办法……
      

  2.   

    用hidden保存状态.然后在ItemDataBound事件中根据hidden的值,显示或隐藏相关行.
      

  3.   

    可用一个隐藏域或Cookie来保存点击的状态,可在页面onload事件里再检查状态值,再确定是否显示
      

  4.   

    有cookie有一点问题就是离开这个页面,再次进来的时候还会保留上次的选择状态.
      

  5.   

    <table>
    <tr>
     <td>第一行</td>
      <td>
          <input type="button" value="隐藏" onclick="GoShowDetail(this,2);" />
     </td>
    </tr>
    <tr>
     <td>第二行
       <asp:HiddenField ID="Hf" runat="server" />
      </td>
    </tr>
    </table>
    我用这个但怎么把"Hf".clientidy传到GoShowDetail这里呢
    function GoShow(btn,i)
     {
        var tr = btn.parentElement.parentElement.nextSibling;    
        tr.style.display = (i==1)?"":"none";
        tr.?? 获得那个行中"Hf".clientidy   //也就是br下面td下面的第一个控件
     }
      

  6.   

    估计hidden是比较好的解决办法了,虽然还是那么麻烦………
      

  7.   

    这个应该用客户端的hidden吧?服务器端的可以这样传:
    function GoShow(btn,i)
     {
        var tr = btn.parentElement.parentElement.nextSibling;    
        tr.style.display = (i==1)?"":"none";
        var obj = document.getElementById('<%=Hf.ClientID%>');
    }
    //上面这个obj就是你的Hf对象了
      

  8.   

    当然我上面的只是一行
    var obj = document.getElementById('<%=Hf.ClientID%>');
    可以行到这个HF.clientID但我这是一个绑定行
    我上面只是取得结果的某一行来做例子谢谢
      

  9.   

    没有那么复杂,用一个hidden就好.
    以下没有测试.functoin SaveCheckState()
    {
     var tb = document.getElementById("DataGrid1");
     var str = "";
     for(var i=0;i<tb.rows.length;i++)
     {
          str += (tb.rows[i].cells[1].firstChild.checked?"1":"0") +",";      
     } str = str.substr(0,str.length-1);
     Form1.Hidden1.value = str;
    }
    function GoShow(btn,i)
    {
        var tr = btn.parentElement.parentElement.nextSibling;    
        tr.style.display = (i==1)?"":"none";
        SaveCheckState(); //调用这个函数
       
    }
      

  10.   

    SaveCheckState()
    你的好像是改变全的啊.
    这样操作就多了,
    我只想操作当绑定行的那个HF值
    如btn.parentElement.parentElement.nextSibling.??.??.value="1"
    这样
    然后在itemdatabound中判断是1还是0 显示隐藏
      

  11.   

    还有问一下
    str = str.substr(0,str.length-1);
    是什么意思
      

  12.   

    第行都有状态的,全部保存最简单.如果点了第二行,第三行,第五行怎么办?这是一个一劳永逸的办法.
    str = str.substr(0,str.length-1); //去掉最后一个字各符,也是就,
      

  13.   

    我用
     function GoShowDetail(btn,i)
     {
        var tr = btn.parentElement.parentElement.nextSibling;
        
        tr.style.display = (i==1)?"":"none";
        var hf=tr.firstChild.firstChild
        hf.value=="1"?hf.value="0":hf.value="1";    
        alert(hf.value);
     }
    可以正确给hf赋值
    但是我的后台中的ItemCreated事件中
    并不能得到我用javascript赋的值
      

  14.   

    alert(hf.value);
    可以知道赋值是正确的
    但我后台
    HiddenField hf = ((HiddenField)e.Item.FindControl("Hf"));
            if (hf.Value == "1")
            {
                hf.Parent.Parent.Visible = true;
            }
    得到的fg.value为""
      

  15.   

    alert(hf.value);
    alert(hf.tagName);看看
      

  16.   

    hf.value=="1"?hf.value="0":hf.value="1";    
        alert(hf.value);
    alert(hf.value);这个可以得到1或0但我点击了别的按钮后在后台的ItemCreated就得不到了
    (因为没有执行itemdatabound所以改写在ItemCreated)
      

  17.   

    aspx.cs:
    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                System.Collections.Hashtable ht = new Hashtable();
                ht.Add("AAAAAAAAAAAAAAAAAAAAAAAAAA", true);
                ht.Add("BB", false);
                ht.Add("CC", "2");
                ht.Add("DD", "3333333333333333333333333333333333");
                ht.Add("EE", "3");
                this.GridView1.DataSource = ht;
                this.GridView1.DataBind();
                this.Repeater1.DataSource = ht;
                this.Repeater1.DataBind();
            }    }
        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            GridViewRow row = e.Row;
            GridViewRow NewRow = new GridViewRow(0, 0, DataControlRowType.DataRow, DataControlRowState.Normal);
            NewRow.Cells.Add(new TableCell());
            NewRow.Cells[0].ColumnSpan = row.Cells.Count;
            NewRow.Style.Add("display", "none");        DataTable dt = new DataTable();
            dt.Columns.Add("A", typeof(string));
            dt.Columns.Add("B", typeof(string));
            dt.Columns.Add("C", typeof(Int32));
            DataRow r1 = dt.NewRow();
            r1[0] = "软件工程";
            r1[1] = "06-01-12";
            r1[2] = 8000;
            dt.Rows.Add(r1);
            r1 = dt.NewRow();
            r1[0] = "网站开发";
            r1[1] = "06-11-10";
            r1[2] = 12000;
            dt.Rows.Add(r1);        this.GridView1.Controls[0].Controls.Add(NewRow);
            GridView gv = new GridView();
            gv.RowDataBound += new GridViewRowEventHandler(gv_RowDataBound);
            gv.DataSource = dt.DefaultView;
            gv.DataBind();
            NewRow.Cells[0].Controls.Add(gv);
            
        }
        protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                e.Row.Attributes.Add("bgcolor", "#cccccc");
            }
        }
        protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
        {    }
        protected void Button1_Click(object sender, EventArgs e)
        {
            string aa = HiddenField1.Value;
        }
        protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {        DataTable dt = new DataTable();
            dt.Columns.Add("A", typeof(string));
            dt.Columns.Add("B", typeof(string));
            dt.Columns.Add("C", typeof(Int32));
            DataRow r1 = dt.NewRow();
            r1[0] = "软件工程";
            r1[1] = "06-01-12";
            r1[2] = 8000;
            dt.Rows.Add(r1);
            r1 = dt.NewRow();
            r1[0] = "网站开发";
            r1[1] = "06-11-10";
            r1[2] = 12000;
            dt.Rows.Add(r1);
            GridView mygv = ((GridView)(e.Item.FindControl("gv_1")));
            mygv.DataSource = dt;
            mygv.DataBind();
        }
        protected void Repeater1_ItemCreated(object sender, RepeaterItemEventArgs e)
        {
             HiddenField hf = ((HiddenField)e.Item.FindControl("Hf"));
            if (hf.Value == "1")
            {
                hf.Parent.Parent.Visible = true;
            }
        }
        protected void Repeater1_PreRender(object sender, EventArgs e)
        {
           
          
        }
    aspx:
    <form id="form1" runat="server">
        <table>
                  <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound" OnItemCreated="Repeater1_ItemCreated">
                    <ItemTemplate>
                        <tr>
                            <td><%# Eval("key") %>
                            </td>
                            <td><%# Eval("value") %>
                            </td>
                            <td><input type="button" value="显示" onclick="GoShowDetail(this,1);" />
                                <input type="button" value="隐藏" onclick="GoShowDetail(this,2);" />
                            </td>
                        </tr>
                        <tr style="display:none">
                            <td colspan="3">
                                <asp:HiddenField ID="Hf" runat="server" Value="0"/>                            
                                <asp:GridView ID="gv_1" runat="server">
                                </asp:GridView>
                            </td>
                        </tr>
                    </ItemTemplate>
                </asp:Repeater>
      </table>
            <div>
                <asp:GridView AutoGenerateColumns="false" ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound"
                    OnRowCommand="GridView1_RowCommand">
                    <Columns>
                        <asp:BoundField DataField="Key" HeaderText="Key" />
                        <asp:BoundField DataField="Value" HeaderText="Value" />
                        <asp:TemplateField>
                            <ItemTemplate>
                                <input type="button" value="显示" onclick="GoShowDetail(this,1);" />
                                <input type="button" value="隐藏" onclick="GoShowDetail(this,2);" />
                            </ItemTemplate>
                        </asp:TemplateField>
                    </Columns>
                </asp:GridView>
                
                <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />            <script type="text/javascript">
     function GoShowDetail(btn,i)
     {
        var tr = btn.parentElement.parentElement.nextSibling;
        
        tr.style.display = (i==1)?"":"none";
        var hf=tr.firstChild.firstChild
        hf.value=="0"?hf.value="1":hf.value="0";    
        alert(hf.value);    
        
     }
     function SaveCheckState()
     {
        var tb = document.getElementById("Repeater1");
        var str = "";
        for(var i=0;i<tb.rows.length;i++)
        {
              str += (tb.rows[i].cells[1].firstChild.checked?"1":"0") +",";      
        }
        str = str.substr(0,str.length-1);
        Form1.HiddenField1.value = str;
    }
                </script>            <asp:HiddenField ID="HiddenField1" runat="server" />        </div>
        </form>
      

  18.   

    还是你上次那个嵌套的
    现在我改用Repeater做也实现了
    上面的代码和页面