1

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

使用这篇文章(第 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>";
  }
}

}
}
4

2 回答 2

3

您必须使用ViewState. 如果您使用List<T>通用实现而不是ArrayList

ViewState["Indices"] = indices;

并恢复它

indices = ViewState["Indices"] as ArrayList;
于 2013-10-01T14:29:11.523 回答
0

正如 Habib 所说,您可以使用ViewState. 您也可以改用,如此ControlState所示。如果您的代码在自定义控件或用户控件中,您可能还需要重写 OnInit 以

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

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

于 2013-10-01T14:42:02.877 回答