【问题标题】:GridView only displays information from the first rowGridView 只显示第一行的信息
【发布时间】:2016-01-20 12:23:30
【问题描述】:

我有两个 GridView。一个只显示日期和用户,第二个显示一个列表,每个项目旁边都有一个复选框。

我已将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。

有没有办法强制回发,以便第二个 Grid 为我选择的行的 ID 重新加载?

这里是 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;

        }
    }

【问题讨论】:

    标签: javascript c# jquery asp.net gridview


    【解决方案1】:

    您没有将子 GridView 与父 GridView 上的任何选择操作绑定,这就是它不会显示任何内容的原因。您在页面加载上编写的代码将始终与父项的第一项绑定。

    要解决此问题,您需要处理父 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();
    }
    

    更新: 这是了解这个想法的最小示例: 部门是父表,类别是子表

    <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();
            }
    

    它应该可以按您的意愿工作。

    【讨论】:

    • 感谢您的代码。但是我在 gvCVRT.SelectedDataKey.Value.ToString() 上的 gridviewParent_SelectedIndexChanged 函数中遇到错误:必须在 GridView 'gvCVRT' 上指定数据键,然后才能检索到选定的数据键。使用 DataKeyNames 属性指定数据键。
    • 我更新了答案,你需要在第一个GridView上添加DataKeyNames="ID"。它现在应该可以工作了
    • 是的,消除了错误,但子网格没有显示
    • 我还有什么需要补充的吗?
    • 我添加了另一个示例,它应该可以工作。如果您仍然有问题,请在 _SelectedIndexChanged 方法上放置断点并跟踪该点以查看问题所在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    相关资源
    最近更新 更多