2013-10-01 78 views
1

我有一个数据的gridview,我想添加一个可以选择多行的复选框列。通过点击它,我想保存行的主键并更改行的css类。在asp.net回发中丢失的变量

使用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>"; 
    } 
} 

} 
} 

回答

3

你必须使用ViewState坚持变量回发。另外它的更好,如果你使用List<T>通用的实现,而不是ArrayList

ViewState["Indices"] = indices; 

并回收回来

indices = ViewState["Indices"] as ArrayList; 
0

正如哈比卜说,你可以使用ViewState。您也可以使用ControlState,如here所示。如果您的代码位于自定义控件或用户控件中,则您可能还需要覆盖OnInit以

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

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