【问题标题】:Gridview Paging checkbox not assigning properlyGridview 分页复选框未正确分配
【发布时间】:2019-05-05 22:05:11
【问题描述】:

我的gridviewpagesize = 2 中有数据。此外,gridview 中的每一行都有一个用于批准/拒绝的复选框。

如果我从第 1 页检查了 2 行,从第 2 页检查了 2 行,它只批准从第 2 页检查的最后两页。为什么会发生这种情况我不知道。我希望所有 4 条记录都获得批准。

下面是我写的代码:

ASPX

<asp:GridView ID="grdDisplayCMMData" runat="server" 
     AutoGenerateColumns="false" Width="100%" ShowHeaderWhenEmpty="true" 
     CssClass="heavyTable table" EmptyDataText="No records to display"
     AllowPaging="true" PageSize="2" 
     OnPageIndexChanging="grdDisplayCMMData_PageIndexChanging">
    <Columns>                    
                <asp:TemplateField HeaderText="ID" Visible="false">
                    <ItemTemplate>
                        <asp:Label ID="lblID_CMM" runat="server" Text='<%#Eval("ID") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="SAP ID">
                    <ItemTemplate>
                        <asp:Label ID="lblSAP_ID_CMM" runat="server" Text='<%#Eval("SAP_ID") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="ID OD CHANGE">
                    <ItemTemplate>
                        <asp:Label ID="lblID_OD_COUNTCHANGE_CMM" runat="server" Text='<%#Eval("ID_OD_COUNTCHANGE") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="ID OD CHANGE DATE">
                    <ItemTemplate>
                        <asp:Label ID="lblID_OD_CHANGEDDATE_CMM" runat="server" Text='<%#Eval("ID_OD_CHANGEDDATE") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="RRH COUNT CHANGE">
                    <ItemTemplate>
                        <asp:Label ID="lblRRH_COUNTCHANGE_CMM" runat="server" Text='<%#Eval("RRH_COUNTCHANGE") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="RRH COUNT CHANGE DATE">
                    <ItemTemplate>
                        <asp:Label ID="lblRRH_CHANGEDDATE_CMM" runat="server" Text='<%#Eval("RRH_CHANGEDDATE") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="TENANCY COUNT CHANGE">
                    <ItemTemplate>
                        <asp:Label ID="lblTENANCY_COUNTCHANGE_CMM" runat="server" Text='<%#Eval("TENANCY_COUNTCHANGE") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="TENANCY COUNT CHANGE DATE">
                    <ItemTemplate>
                        <asp:Label ID="lblTENANCY_CHANGEDDATE_CMM" runat="server" Text='<%#Eval("TENANCY_CHANGEDDATE") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="STATUS">
                    <ItemTemplate>
                        <asp:Label ID="lblSTATUS_CMM" runat="server" Text='<%#Eval("STATUS") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="CREATED BY" Visible="false">
                    <ItemTemplate>
                        <asp:Label ID="lblCREATEDBY_CMM" runat="server" Text='<%#Eval("CREATED_BY") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Approve/Reject">
                    <ItemTemplate>
                        <asp:CheckBox ID="chkApprRejCMM" runat="server" />
                    </ItemTemplate>
                </asp:TemplateField>
    </Columns>                
</asp:GridView>

C#代码:

protected void btnApproveCMM_Click(object sender, EventArgs e)
{
    try
    {
            bool flgCMM = false;
            IPColoFields ObjIPColoFields = new App_Code.IPColoFields();
            List<IPColoBilling_BKP.App_Code.UMS.UMSGroupDetails> UMSGroupDetails = (List<IPColoBilling_BKP.App_Code.UMS.UMSGroupDetails>)Session["lstUMSGroupDetails"];

            Session["lstUMSGroupDetails"] = UMSGroupDetails;
            string strApprove = "";

            foreach (GridViewRow gvrow in grdDisplayCMMData.Rows)
            {
                var checkbox = gvrow.FindControl("chkApprRejCMM") as CheckBox;

                if (checkbox.Checked)
                {
                    flgCMM = true;

                    int Id = Convert.ToInt32((grdDisplayCMMData.Rows[gvrow.RowIndex].FindControl("lblID_CMM") as Label).Text);

                    ObjIPColoFields.Unique_Id = Id;
                    ObjIPColoFields.UMS_GRP_BY_ID = intCurrentGrpId;
                    ObjIPColoFields.UMS_GRP_BY_NAME = strCurrentGrp;
                    ObjIPColoFields.UMS_GRP_TO_ID = UMSGroupDetails[1].GroupID;
                    ObjIPColoFields.UMS_GRP_TO_NAME = UMSGroupDetails[1].GroupName;
                    ObjIPColoFields.FCA_STATUS = "1";
                    ObjIPColoFields.LAST_UPDATED_BY = lblUserName.Text;
                    strApprove = CommonDB.Approve_IPCOLO_CMMLevel(ObjIPColoFields);
                }
            }

            BindCMMData();
            if (flgCMM == false)
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", "alert('Please check atleast one row'); window.location ='IpColoDefault.aspx';", true);
            }
            else
            {
                ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", "alert('Record Approved successfully'); window.location ='IpColoDefault.aspx';", true);

            }

    }
    catch (Exception ex)
    {
        string strErrorMsg = ex.Message.ToString() + " " + "StackTrace :" + ex.StackTrace.ToString();
        CommonDB.WriteLog("ERROR:" + strErrorMsg, ConfigurationManager.AppSettings["IPCOLO_LOG"].ToString());
    }
}

另见分页代码

protected void grdDisplayCMMData_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
        try
        {
            BindCMMData();
            grdDisplayCMMData.PageIndex = e.NewPageIndex;
            grdDisplayCMMData.DataBind();
        }
        catch (Exception ex)
        {
            string strErrorMsg = ex.Message.ToString() + " " + "StackTrace :" + ex.StackTrace.ToString();
            CommonDB.WriteLog("ERROR:" + strErrorMsg, ConfigurationManager.AppSettings["IPCOLO_LOG"].ToString());
        }
}

【问题讨论】:

  • 每次进行分页时,您都会丢失前一页的复选框。我敢打赌,如果你在 pg1 上检查了一些,然后在 pg2 上检查,然后又回到 pg1,它就会被取消检查。
  • @tgolisch:你到底是什么意思?任何链接或如何使其工作。请建议
  • 我喜欢 a.bajorinas 将其存储在视图状态中的概念。我建议在PageIndexChanging 上尝试:保存上一页的checked 设置,然后为当前页面加载checked 设置(如果有)。我只会在form_load 上打电话给BindCmmData()。我什至可以在该数据集中添加一个额外的列来保存checked 状态。
  • @tgolisch:好的,让我试试看
  • @tgolisch:a.bajorinas 逻辑对我有用。和他商量了一下,解决了。也感谢你的投入

标签: c# asp.net gridview checkbox paging


【解决方案1】:

嗯,我可以想出两种方法来解决问题。

  • 更改您的页面事件以显示/隐藏项目。

    默认网格视图分页事件会触发回发并重新绑定网格,因此,您无法访问前一页上的复选框,它们只会“消失”。现在,您可以通过加载完整的网格然后将不在您定义的页面范围内的项目的可见性设置为不可见来解决这个问题。但这会因大量数据而变得非常繁重,因此我不推荐此解决方案。

  • 第二种解决方案是保存复选框状态,比如ViewState

    这样,您应该为您的复选框实现一个OnCheckedChanged 事件,该事件将在已检查索引的视图状态中添加/删除自身。现在您还必须实现一个OnItemDataBound 事件以从您的视图状态呈现复选框状态。最后一步是单击按钮以循环查看视图状态并对每个项目执行逻辑。

    <asp:GridView ID="grdDisplayCMMData" runat="server" 
        AutoGenerateColumns="false" Width="100%" ShowHeaderWhenEmpty="true" 
        CssClass="heavyTable table" EmptyDataText="No records to display"
        AllowPaging="true" PageSize="2" 
        OnPageIndexChanging="grdDisplayCMMData_PageIndexChanging">
        OnItemDataBound="grdDisplayCMMData_OnItemDataBound"
        <Columns>
            <asp:TemplateField HeaderText="Approve/Reject">
                <ItemTemplate>
                    <asp:CheckBox ID="chkApprRejCMM" runat="server" OnCheckedChange="chkApprRejCMM_OnCheckedChanged" />
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    
    protected void chkApprRejCMM_OnCheckedChanged(object sender, EventArgs e)
    {
        if(ViewState["CheckedCheckboxes"] != null)
        {
            var CheckedCheckboxes = (List<int>)ViewState["CheckedCheckboxes"];
            var checkbox = (CheckBox)sender;
            var idLabel = (TextBox)checkbox.BindingContainer.FindControl("lblID_CMM");
            if(idLabel != null && !string.IsNullOrEmpty(idLabel.Text))
            {
                if(checkbox.Checked)
                {
                    if(!CheckedCheckboxes.Contains(Convert.ToInt32(idLabel.Text)))
                        CheckedCheckboxes.Add(Convert.ToInt32(idLabel.Text));
               }
                else
                {
                    if(CheckedCheckboxes.Contains(Convert.ToInt32(idLabel.Text)))
                        CheckedCheckboxes.Remove(Convert.ToInt32(idLabel.Text))
                }
            }
            ViewState["CheckedCheckboxes"] = CheckedCheckboxes; 
        }
    }
    
    protected void grdDisplayCMMData_OnItemDataBound(object sender, GridViewEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        { 
            if(ViewState["CheckedCheckboxes"] != null)
            {
                var CheckedCheckboxes = (List<int>)ViewState["CheckedCheckboxes"];
                var checkbox = (CheckBox)e.Row.FindControl("lchkApprRejCMM");
                var idLabel = (TextBox)e.Row.FindControl("lblID_CMM");
                if(idLabel != null && checkbox != null && !string.IsNullOrEmpty(idLabel.Text))
                {
                       if(CheckedCheckboxes.Contains(Convert.ToInt32(idLabel.Text)))
                        checbox.Checked = true;
                    else
                        checbox.Checked = false;
                }
            }
        }
    }
    
    protected void YourButtonClick(object sender, EventArgs e)
    {
        if(ViewState["CheckedCheckboxes"] != null)
        {
            var CheckedCheckboxes = (List<int>)ViewState["CheckedCheckboxes"];
            foreach (var id in CheckedCheckboxes)
            {
               //perform logic with id
            }
        }
    }
    

编辑 1:我在不使用 IDE 的情况下编写代码时遗漏了一些错误

【讨论】:

  • 你的代码在这里有错误if(idLabel != null &amp;&amp; !string.IsNullOrEmpty(idLabel.Text))
  • 很抱歉,当时我无法对代码进行 lint/测试,这是什么错误?
  • 抱歉,我有一段时间没空。我很抱歉。我创建的Listint 类型,我写的方法是将字符串传递给Contains 编辑后的版本应该是CheckedCheckboxes.Contains(Convert.ToInt32(idLabel.Text)),因为我在没有短绒的情况下在旅途中写这个,我让它去通过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 2012-04-23
  • 2011-06-01
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 2015-12-27
相关资源
最近更新 更多