0

只是我想知道为什么!

它是 GridView 的 DataSource 类型吗?还是中继器内部实现?

错误文本:

The GridView 'grdArticles' fired event PageIndexChanging which wasn't handled.

下面是 Markup 代码,我想大家应该都很熟悉了。

<asp:Repeater ID="rptCategories" DataSourceID="ldsCategories" runat="server">
    <ItemTemplate>


        <asp:GridView runat="server" ID="grdArticles" AllowPaging="true" GridLines="None" DataKeyNames="id" AutoGenerateColumns="false" DataSource='<%# Eval("Articles") %>'>
            <Columns>

                <asp:TemplateField ShowHeader="false" ItemStyle-Width="100%" FooterStyle-Width="100%">
                <ItemTemplate>
                    <div class="article-menu-item">
                        <h1>
                            <asp:HyperLink ID="lnkTitle" CssClass="article-menu-title" runat="server" Text ='<%# Eval("title") %>' 
                                NavigateUrl='<%# Vars.ArticleUrl + "?action=view&id=" + Eval("id") %>' ></asp:HyperLink>
                        </h1>

                        <!-- Date -->
                        <div class="article-menu-date">
                            <asp:Label ID="Label1" runat="server" Text='<%# Eval("date") %>'></asp:Label>
                        </div>

                        <!-- Meta Content -->
                        <div class="article-menu-meta">
                        <asp:Label ID="lblContent" runat="server" Text='<%# Bind("meta") %>'></asp:Label>
                        </div>

                        <div class="article-menu-delete">
                            <asp:LinkButton ID="btnDelete" Text="Delete" runat="server" OnClick="btnDelete_Click" TargetID='<%# Eval("id") %>' />
                        </div>
                        <!-- Line -->
                        <div style="border-bottom: 1px solid #ccc"></div>
                    </div>
                </ItemTemplate>
                </asp:TemplateField>
            </Columns>
            <EmptyDataTemplate>
                <p>No items to view!</p>
            </EmptyDataTemplate>
        </asp:GridView>

        <br />

    </ItemTemplate>
</asp:Repeater>

编辑:

如果我使用代码实现 OnPageIndexChanging 事件(并修改了 aspx gridview 标记来处理事件):

ASPX:

<asp:GridView runat="server" ID="grdArticles" AllowPaging="true" OnPageIndexChanging="grdArticles_PageIndexChanging" GridLines="None" DataKeyNames="id" AutoGenerateColumns="false" DataSource='<%# Eval("Articles") %>'>

CS:

protected void grdArticles_PageIndexChanging(object sender, GridViewPageEventArgs e)
{   
    GridView grd = sender as GridView;

    grd.PageIndex = e.NewPageIndex;
    grd.DataBind();

}

抛出另一个异常:

Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.

编辑#2:

在遵循 @Garrison 先生的解决方案并使用代码处理 Repeater itemDataBound 事件之后:

protected void rptCategories_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    GridView grd = e.Item.FindControl("grdArticles") as GridView;

    if (grd != null)
    {
        DatabaseDataClassesDataContext dc = new DatabaseDataClassesDataContext();
        grd.DataSource = dc.Articles.Where(a => a.category_id == (e.Item.DataItem as Category).id);
        grd.DataBind();
    }
}

还有一个问题:没有抛出异常,但是当导航到另一个页面时,GridView 显示 NO ROWS!

我真的认为中继器核心实现存在问题!

4

2 回答 2

2

你有两个选择:

  • 删除分页:AllowPaging="false"在您的 GridView 中设置。
  • 实现分页:设置OnPageIndexChanging="grdArticles_PageIndexChanging"

在后面的代码中创建一个方法,如下所示:

protected void grdArticles_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    grdArticles.PageIndex = e.NewPageIndex;
    grdArticles.DataBind();
}

现在我们已经解决了第一个问题,让我们来解决第二个问题。你需要处理你RepeaterItemDataBound事件。在那里,首先使用以下代码找到您的 GridView:

var grdArticles = (GridView)e.Item.FindControl("grdArticles");

现在您可以访问 GridView,但您必须找到要数据绑定到 GridView 的文章集。我不知道您是如何检索数据的,所以我将这部分留给您,但是一旦您找到要绑定的文章列表,请使用以下代码:

grdArticles.DataSource = relevantArticles; // relevantArticles is a stand-in variable name, because I don't know how you're going to do it
grdArticles.DataBind();
于 2013-07-11T22:11:06.820 回答
0

我已经弄清楚 - 在其他人的帮助下 - 这是 DataSource 类型的问题,在我的示例中Eval("Items"),我不知道它的类型是什么,但它不支持自动分页。

因此,摆脱它的一种方法- 无需重写分页逻辑和编写大量代码并弄乱 Sessions 和查询- 是处理 GridView 容器的 ItemDataBound,我的意思是 Repeater 或 DataList,或者你可以处理 GridView 的 OnPreRender 并创建支持自动分页的 DataSource,如LinqDataSource.

您可能还需要PageIndexChanging像@Garrison 告诉我们的那样处理 GridView :

protected void grdArticles_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    grdArticles.PageIndex = e.NewPageIndex;
    grdArticles.DataBind();
}

之后我得到了一切工作:)

于 2013-07-12T11:58:17.157 回答