0

理由を知りたいだけです!

GridView の DataSource タイプですか? またはリピーターの内部実装?

エラーテキスト:

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

これがマークアップ コードです。誰もが十分に知っていると思います。

<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:

Mr @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 に行が表示されません!!

本当にリピーターコアの実装に問題があると思います!

4

2 に答える 2

2

次の 2 つのオプションがあります。

  • ページングの削除: AllowPaging="false"GridView で設定します。
  • ページングの実装: 設定OnPageIndexChanging="grdArticles_PageIndexChanging"

コード ビハインドで次のようなメソッドを作成します。

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

第 1 の問題が終わったので、第 2 の問題に取り組みましょう。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")

そのため、ページング ロジックを書き換えたり、大量のコードを記述したり、セッションやクエリを混乱させたりすることなく、そこから抜け出す 1 つの方法は、GridView のコンテナー、つまり Repeater または DataList の ItemDataBound を処理することです。 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 に答える