在asp.net中回发丢失的变量

时间:2013-10-01 14:25:07

标签: c# asp.net gridview

我有一些包含一些数据的gridview,我想添加一个可以选择多行的复选框列。通过单击它我想保存行的主键并更改行的css类。

使用this article(step 2)我创建了itemtemplate,添加了一个复选框(将ID指定为TransactionSelector),并向其添加了checkedChange()。在那里我只更改一个css类的行并向arraylist添加一个行索引。但是当我点击显示此列表的事件的按钮时,它没有项目。

        <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" >
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <asp:CheckBox ID="TransactionSelector" runat="server" 
                        oncheckedchanged="TransactionSelector_CheckedChanged" AutoPostBack="True" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="iTransactionsId" HeaderText="iTransactionsId" 
                SortExpression="iTransactionsId" />
            <asp:BoundField DataField="mAmount" HeaderText="mAmount" 
                SortExpression="mAmount" />
            <asp:BoundField DataField="vchTransactionType" HeaderText="vchTransactionType" 
                SortExpression="vchTransactionType" />
            <asp:BoundField DataField="dtDate" HeaderText="dtDate" 
                SortExpression="dtDate" />
            <asp:BoundField DataField="cStatus" HeaderText="cStatus" 
                SortExpression="cStatus" />
            <asp:BoundField DataField="test123" HeaderText="test123" 
                SortExpression="test123" />
        </Columns>
        <RowStyle CssClass="unselectedRow" />
    </asp:GridView>

</asp:Panel>

<asp:Panel ID="InfoPanel" runat="server" CssClass="infoPanel">

    <asp:Button ID="ShowSelected" runat="server" Text="Button" 
        onclick="ShowSelected_Click" />

    <asp:Label ID="InfoLabel" runat="server"></asp:Label>

</asp:Panel>

C夏普代码:

public partial class WebForm1 : System.Web.UI.Page
{
    ArrayList indices = new ArrayList();


protected void Page_Load(object sender, EventArgs e)
{
   if (!IsPostBack)
     {
       GridView1.DataSourceID = "SqlDataSource1";
       GridView1.DataBind();
     }
}



protected void TransactionSelector_CheckedChanged(object sender, EventArgs e)
{
   CheckBox cb = (CheckBox)sender;
   GridViewRow row = (GridViewRow)cb.NamingContainer;
   // row.CssClass = (cb.Checked) ? "selectedRow" : "unselectedRow";
   if (cb.Checked)
   {
     row.CssClass = "selectedRow";
     indices.Add(row.RowIndex);
   }
   else
   {
     row.CssClass = "unselectedRow";
     indices.Remove(row.RowIndex);
   }
}

protected void ShowSelected_Click(object sender, EventArgs e)
{
  InfoLabel.Text = "";
  foreach (int i in indices)
  {
   InfoLabel.Text += i.ToString() + "<br>";
  }
}

}
}

2 个答案:

答案 0 :(得分:3)

您必须使用ViewState在回发中保留变量。如果您使用List<T>通用实现而不是ArrayList

,也会更好
ViewState["Indices"] = indices;

并将其恢复原状

indices = ViewState["Indices"] as ArrayList;

答案 1 :(得分:0)

正如Habib所说,你可以使用ViewState。您也可以使用ControlState,如图所示here。如果您的代码位于自定义控件或用户控件中,则可能还需要将OnInit重写为

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    Page.RegisterRequiresControlState(this);
}

请随时回复反馈。我是新发布的答案。