簡體   English   中英

Gridview分頁復選框未正確分配

[英]Gridview Paging checkbox not assigning properly

我在gridview有數據,並且pagesize = 2 此外,gridview中的每一行都有一個復選框,用於批准/拒絕。

如果我從第一頁檢查了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());
        }
}

好吧,我可以想到兩種方法來解決問題。

  • 更改頁面事件以顯示/隱藏項目。

    默認的網格視圖分頁事件會觸發回發並重新綁定網格,因此,您無法訪問上一頁中的復選框,它們只是“消失”。 現在,您可以解決此問題,方法是加載整個網格,然后將不在您定義的頁面范圍內的項目的可見性設置為不可見。 但這對於海量數據變得非常繁重,因此我不推薦這種解決方案。

  • 第二種解決方案是保存復選框狀態,比如說一個ViewState

    這樣,您應該為自己的檢查框實現一個OnCheckedChanged事件,該事件將在已檢查索引的視圖狀態中添加/刪除自身。 現在,您還必須實現OnItemDataBound事件,以從viewstate呈現復選框狀態。 最后一步是單擊按鈕以遍歷視圖狀態並在每個項目上執行邏輯。

     <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的情況下編寫代碼遺漏了一些錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM