簡體   English   中英

GridView僅顯示第一行的信息

[英]GridView only displays information from the first row

我有兩個GridViews。 一個僅顯示日期,一個用戶,第二個顯示日期,每個項目旁邊都有一個復選框。

我已將gridview中的日期設置為鏈接,以查看第二個gridview,以便用戶可以看到哪些項目已被勾選。 問題是即使我選擇了第二行,它也只顯示第一行的信息。 在此處輸入圖片說明

在圖像中看到,我單擊了頂部GridView中的第二行。 但是第二個GridView中顯示的信息不是我單擊的行。 它應該顯示ID 395545的信息

我發現問題出在回發上:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
           List<lookupCVRT> work = lookupCVRT.GetCVRTItems(Company.Current.CompanyID, ParentID.ToString());


                ViewState["CVRT"] = work;
                gvCVRT.DataSource = work;
                gvCVRT.DataBind();

                if (work.Count > 0)
                {
                    string numberToView = gvCVRT.Rows[0].Cells[0].Text;

                    List<lookupCVRT> workDetails = lookupCVRT.GetChecklistItemsByChecklistID(Company.Current.CompanyID, ParentID.ToString(), numberToView.ToString());
                    gvCVRTDetails.DataSource = workDetails;
                    gvCVRTDetails.DataBind();
                } 
         }
    }

此代碼加載第一個GridView的信息,然后根據此GridView中的ID加載第二個GridView。 問題在於它僅加載第一行的ID。 因此,當它綁定第二個GridView時,它僅查看第一個ID。

有沒有辦法強制回發,以便為我選擇的行的ID重新加載第二個Grid?

這是GridView代碼:

<div id="divCVRT">
    <fieldset class="groupbox" >                               
        <div style="width:100%;">
            <asp:UpdatePanel ID="udpCVRT" UpdateMode="Conditional" runat="server">
                <ContentTemplate>
                    <asp:GridView  style="width:75%"  
                        ID="gvCVRT" 
                        ShowHeaderWhenEmpty="true"
                        CssClass="tblResults" 
                        runat="server" 
                        OnRowDataBound="gvCVRT_RowDataBound"                             
                        DataKeyField="ID" 
                        AutoGenerateColumns="false"
                        allowpaging="false"
                        AlternatingRowStyle-BackColor="#EEEEEE">
                        <HeaderStyle CssClass="tblResultsHeader" />
                        <Columns>
                            <asp:BoundField DataField="ChecklistID" HeaderText="ID" ></asp:BoundField> 
                            <asp:BoundField DataField="ChecklistDate" HeaderText="Checklist Date" dataformatstring="{0:dd/MM/yyyy}"></asp:BoundField>
                            <asp:BoundField DataField="User" HeaderText="User" ></asp:BoundField>
                        </Columns>
                    </asp:GridView>
                </ContentTemplate>
            </asp:UpdatePanel>  
            <asp:LinkButton title="Add CVRT" id="btnAddCVRT" OnClick="btnAddCVRT_Click" runat="server" style="cursor:pointer;">
                <img src="../images/icons/buttons/basic1-072.png" />
            </asp:LinkButton>
        </div>
    </fieldset>
</div>
<div id="divCVRTDetails" style="display:none">
    <fieldset class="groupbox" >                               
        <div style="width:100%;">
            <asp:UpdatePanel ID="udpCVRTDetails" UpdateMode="Conditional" runat="server">
                <ContentTemplate>
                    <asp:GridView  style="width:75%"  
                        ID="gvCVRTDetails" 
                        ShowHeaderWhenEmpty="true"
                        CssClass="tblResults" 
                        runat="server" 
                        OnRowDataBound="gvCVRTDetails_RowDataBound"                             
                        DataKeyField="ID" 
                        AutoGenerateColumns="false"
                        allowpaging="false"
                        AlternatingRowStyle-BackColor="#EEEEEE">
                        <HeaderStyle CssClass="tblResultsHeader" />
                        <Columns>
                            <asp:BoundField DataField="ChecklistID" HeaderText="ID" ></asp:BoundField> 
                            <asp:BoundField DataField="Description" HeaderText="Checklist Items"></asp:BoundField> 
                            <asp:TemplateField HeaderText ="Checked?" ItemStyle-HorizontalAlign="Center">
                                <ItemTemplate>
                                         <asp:CheckBox ID="chkChecked" runat="server" ></asp:CheckBox>
                                </ItemTemplate>
                            </asp:TemplateField>
                        </Columns>
                    </asp:GridView>
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="btnUpdateCVRT" />
                    <asp:AsyncPostBackTrigger ControlID="btnAddCVRT" />
                </Triggers>
            </asp:UpdatePanel>
            <asp:LinkButton ID="btnUpdateCVRT" OnClientClick="CloseAddEditCVRT()"  OnClick="btnUpdateCVRT_Click" runat="server" style="float:left" CssClass="btnSaveSmall" ></asp:LinkButton>
            <a title="Close CVRT Details" id="btnCloseCVRTDetails" runat="server" class="btnCancelSmall" style="cursor:pointer; margin-left:40px">
            </a>  
        </div>
</fieldset>

子GridView后面的代碼:

protected void gvCVRTDetails_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            lookupCVRT work = (lookupCVRT)e.Row.DataItem;
            GridView gv = sender as GridView;



            e.Row.Attributes.Add("ID", "gvCVRTDetails_" + work.ID);
            e.Row.Cells[0].Attributes.Add("onclick", "event.stopPropagation();");

            HtmlGenericControl lnkShowHide = (HtmlGenericControl)e.Row.FindControl("lnkShowHide");
            HyperLink ChecklistItem = (HyperLink)e.Row.FindControl("ID");

            CheckBox chkChecked = e.Row.FindControl("chkChecked") as CheckBox;

            chkChecked.Attributes.Add("onclick", "UpdateCheckedBox(" + work.ID.ToString() + ", this.value);");

            chkChecked.Checked = work.Checked;

        }
    }

您沒有將子GridView與父GridView上的任何選擇動作綁定在一起,這就是為什么它不會顯示任何內容的原因。 您在Page Load上編寫的代碼將始終與父項的第一項綁定。

要解決此問題,您需要處理父GridView的OnSelectedIndexChanged,然后根據所選ID綁定子GridView。

查看更新的代碼(我刪除了Ajax代碼,因此將其重新發布到頁面):

<div id="divCVRT">
    <fieldset class="groupbox" >                               
        <div style="width:100%;">
                <asp:GridView  style="width:75%"  
                        ID="gvCVRT" 
                        ShowHeaderWhenEmpty="true"
                        CssClass="tblResults" 
                        runat="server" 
                        OnRowDataBound="gvCVRT_RowDataBound"                             
                        DataKeyField="ID"
                        DataKeyNames="ID"
                OnSelectedIndexChanged="gridviewParent_SelectedIndexChanged"
                        AutoGenerateColumns="false"
                        allowpaging="false"
                        AlternatingRowStyle-BackColor="#EEEEEE">
                        <HeaderStyle CssClass="tblResultsHeader" />
                        <Columns>
                            <asp:BoundField DataField="ChecklistID" HeaderText="ID" ></asp:BoundField> 
                            <asp:BoundField DataField="ChecklistDate" HeaderText="Checklist Date" dataformatstring="{0:dd/MM/yyyy}"></asp:BoundField>
                            <asp:BoundField DataField="User" HeaderText="User" ></asp:BoundField>
                <asp:CommandField ShowSelectButton="True" />
                        </Columns>
                    </asp:GridView>
            <asp:LinkButton title="Add CVRT" id="btnAddCVRT" OnClick="btnAddCVRT_Click" runat="server" style="cursor:pointer;">
                <img src="../images/icons/buttons/basic1-072.png" />
            </asp:LinkButton>
        </div>
    </fieldset>
</div>
<div id="divCVRTDetails" style="display:none">
    <fieldset class="groupbox" >                               
        <div style="width:100%;">
                <asp:GridView  style="width:75%"  
                        ID="gvCVRTDetails" 
                        ShowHeaderWhenEmpty="true"
                        CssClass="tblResults" 
                        runat="server" 
                        OnRowDataBound="gvCVRTDetails_RowDataBound"                             
                        DataKeyField="ID" 
                        AutoGenerateColumns="false"
                        allowpaging="false"
                        AlternatingRowStyle-BackColor="#EEEEEE">
                        <HeaderStyle CssClass="tblResultsHeader" />
                        <Columns>
                            <asp:BoundField DataField="ChecklistID" HeaderText="ID" ></asp:BoundField> 
                            <asp:BoundField DataField="Description" HeaderText="Checklist Items"></asp:BoundField> 
                            <asp:TemplateField HeaderText ="Checked?" ItemStyle-HorizontalAlign="Center">
                                <ItemTemplate>
                                         <asp:CheckBox ID="chkChecked" runat="server" ></asp:CheckBox>
                                </ItemTemplate>
                            </asp:TemplateField>
                        </Columns>
                    </asp:GridView>
            <asp:LinkButton ID="btnUpdateCVRT" OnClientClick="CloseAddEditCVRT()"  OnClick="btnUpdateCVRT_Click" runat="server" style="float:left" CssClass="btnSaveSmall" ></asp:LinkButton>
            <a title="Close CVRT Details" id="btnCloseCVRTDetails" runat="server" class="btnCancelSmall" style="cursor:pointer; margin-left:40px"></a>  
        </div>
</fieldset>

然后在后面的代碼中:

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        List<lookupCVRT> work = lookupCVRT.GetCVRTItems(Company.Current.CompanyID, ParentID.ToString());
        gvCVRT.DataSource = work;
        gvCVRT.DataBind();
     }
}

protected void gridviewParent_SelectedIndexChanged(object sender, EventArgs e)
{
    List<lookupCVRT> workDetails = lookupCVRT.GetChecklistItemsByChecklistID(Company.Current.CompanyID, ParentID.ToString(), gvCVRT.SelectedDataKey.Value.ToString());
    gvCVRTDetails.DataSource = workDetails;
    gvCVRTDetails.DataBind();
}

更新:這是獲得想法的最小示例:Department是父表,類別是子表

<div>
            <asp:GridView runat="server" ID="ParentGridView"
                DataKeyNames="DepartmentId" AutoGenerateColumns="false"
                OnSelectedIndexChanged="ParentGridView_SelectedIndexChanged">
                <Columns>
                    <asp:BoundField DataField="DepartmentId" HeaderText="DepartmentId"></asp:BoundField>
                    <asp:BoundField DataField="DepartmentName" HeaderText="DepartmentName"></asp:BoundField>
                    <asp:BoundField DataField="DepartmentDescription" HeaderText="DepartmentDescription"></asp:BoundField>
                    <asp:CommandField ShowSelectButton="True" />
                </Columns>
            </asp:GridView>

            <br />
            <br />

            <asp:GridView runat="server" ID="ChildGridView" AutoGenerateColumns="false">
                <Columns>
                    <asp:BoundField DataField="CategoryName" HeaderText="CategoryName"></asp:BoundField>
                    <asp:BoundField DataField="CategoryDescription" HeaderText="CategoryDescription"></asp:BoundField>
                </Columns>
            </asp:GridView>
        </div>

后面的代碼:

 protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                DataClasses1DataContext db = new DataClasses1DataContext();
                var data = db.Departments.ToList();

                ParentGridView.DataSource = data;
                ParentGridView.DataBind();
            }
        }

        protected void ParentGridView_SelectedIndexChanged(object sender, EventArgs e)
        {
            int key = int.Parse(ParentGridView.SelectedDataKey.Value.ToString());

            DataClasses1DataContext db = new DataClasses1DataContext();
            var data = db.Categories.Where(p => p.DepartmentId == key);

            ChildGridView.DataSource = data;
            ChildGridView.DataBind();
        }

它應該可以根據需要工作。

暫無
暫無

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

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