选中CheckBox后,在排序或分页(而不是GridView)

时间:2015-07-23 13:23:55

标签: c# asp.net checkbox

我在aspx表单页面中有一个复选框,在GridView外部。

如果我选中此复选框,则会执行一个填充此gridview并更新行的查询。

此Gridview是分页的,当我更改页面返回到初始GridView行并丢失复选框中的选择时。

有没有办法在排序和分页后保持检查?

感谢。

编辑#1

我的代码如下。

当在 BindData()中选中复选框时,会对初始执行不同的查询。

int ck = 0;

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        BindData();
    }
}


protected void ddlPages_SelectedIndexChanged(object sender, EventArgs e)
{
    GridViewRow gvrPager = gvProducts.BottomPagerRow;
    DropDownList ddlPages = (DropDownList)gvrPager.Cells[0].FindControl("ddlPages");

    gvProducts.PageIndex = ddlPages.SelectedIndex;
    BindData();
}

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{

    gvProducts.PageIndex = e.NewPageIndex;
    BindData();
}

protected void Paginate(object sender, CommandEventArgs e)
{
    int intCurIndex = gvProducts.PageIndex;

    switch (e.CommandArgument.ToString().ToLower())
    {
        case "First":
            gvProducts.PageIndex = 0;
            break;
        case "Prev":
            gvProducts.PageIndex = intCurIndex - 1;
            break;
        case "Next":
            gvProducts.PageIndex = intCurIndex + 1;
            break;
        case "Last":
            gvProducts.PageIndex = gvProducts.PageCount - 1;
            break;
    }
    gvProducts.DataBind();
}

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        if (Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "money")) > 100000)
        {
            e.Row.BackColor = System.Drawing.Color.AntiqueWhite;
        }
    }

    if (e.Row.RowType == DataControlRowType.Pager)
    {
        DropDownList ddl = (DropDownList)(e.Row.FindControl("ddlpages"));
        Label lblPageCount = (Label)e.Row.FindControl("lblPageCount");

        if (lblPageCount != null)
            lblPageCount.Text = gvProducts.PageCount.ToString();

        for (int i = 1; i <= gvProducts.PageCount; i++)
        {
            ddl.Items.Add(i.ToString());
        }

        ddl.SelectedIndex = gvProducts.PageIndex;

        if (gvProducts.PageIndex == 0)
        {
            ((ImageButton)e.Row.FindControl("ImageButton1")).Visible = false;
            ((ImageButton)e.Row.FindControl("ImageButton2")).Visible = false;
        }

        if (gvProducts.PageIndex + 1 == gvProducts.PageCount)
        {
            ((ImageButton)e.Row.FindControl("ImageButton3")).Visible = false;
            ((ImageButton)e.Row.FindControl("ImageButton4")).Visible = false;
        }
    }
}


protected void chkLinked_CheckedChanged(Object sender, EventArgs args)
{
    if (sender != null)
    {
        try
        {
            if (((CheckBox)sender).Checked)
            {
                ck = 1;
                BindData();
            }
            else
            {
                ck = 0;
                BindData();
            }
        }
        catch { }
    }
}

编辑#2

private DataSet RetrieveProducts()
{
    if (ViewState["Products"] != null)
        return (DataSet)ViewState["Products"];

        if (ck > 0)
        {
            sql = @" SELECT * FROM doTable Where money > 100000; ";
        }
        else
        {
            sql = @" SELECT * FROM doTable; ";
        }

    DataSet dsProducts = new DataSet();

    using (OdbcConnection cn =
      new OdbcConnection(ConfigurationManager.ConnectionStrings["ConnMySQL"].ConnectionString))
    {
        cn.Open();

        using (OdbcCommand cmd = new OdbcCommand(sql, cn))

            OdbcDataAdapter adapter = new OdbcDataAdapter(cmd);
            adapter.Fill(dsProducts);
        }
    }

    return dsProducts;
}


private void BindData()
{
    gvProducts.DataSource = RetrieveProducts();
    gvProducts.DataBind();
}

1 个答案:

答案 0 :(得分:2)

可能的原因可能是没有为复选框启用Viewstate,这就是为什么它不保留状态。要启用它,您可以使用复选框的EnableViewState属性。

<asp:CheckBox ID="chkLinked" runat="server" EnableViewState="true"/>.