2

私は現在 .NET を学習しているので、これがばかげた質問である場合はご容赦ください。

私は 2 つの MSSQL テーブルを持っています。1 つは 'Comment' と呼ばれ、もう 1 つは 'CommentAdditionalAuthor' と呼ばれます。Comment テーブルには、コメントのタイトル、日付、主な作成者名など、コメント フォームからのデータが保持されます。CommentAdditionalAuthor テーブルには、コメントに貢献した他の作成者に関する情報が含まれます。したがって、そこには 1 対多の関係があります。各コメントには 1 人以上の追加の作成者を含めることができます。

Comment テーブルのデータをバインドするリピーター コントロールがありますが、これはうまく機能します。今私がやりたいことは、コメントと一緒に著者の詳細を出力することです。事実上、リピーターの中のリピーターです。

このコードをできる限りクリーンアップしようとしましたが、解決策を理解できるように、私がやっていることに関連したままにしておきたいので、まだかなり長いことをお詫びします. これの他の例を見つけたので、それらがさまざまな方法でデータにバインドされるため、それらを実装するのに苦労しています。これは私のアプリケーションでは機能しません。

aspx ファイルのコードは次のようになります。

<div id="comments">
    <asp:Repeater ID="rptComments" runat="server">
    <ItemTemplate>
        <div class="comment-data">
            <h3 class="item">Submitted to <%# GetPageDetails(Eval("nodeid")) %> article on <%# Eval("created") %></strong></h3>
            <p class="item"><strong>Name</strong> <%# Eval("firstname") %> <%# Eval("surname") %></p>
            <p class="item"><strong>Occupation</strong> <%# Eval("occupation") %></p>
            <p class="item"><strong>Affiliation</strong> <%# Eval("affiliation") %></p>
            <p class="item"><strong>Email</strong> <a href='mailto:<%# Eval("email") %>'><%# Eval("email") %></a> <em>Publish email: <%# Eval("publishemail") %></em></p>
            <p class="item"><strong>Competing interests?</strong> <%# Eval("competingintereststext") %>&nbsp;</p>
            <p class="item"><strong>eLetter title</strong> <%# Eval("title") %></p>
            <p><%# Eval("comment").ToString().Replace("\n", "<br/>")%></p>


            <!-- This is what I want to do, but can't get it to bind: -->
            <div class="additional-authors">
                <h3>Additional authors</h3>
                <asp:Repeater id="rptAdditionalAuthors" runat="server">
                    <ItemTemplate>
                        <%# Eval("firstnameother")%><br>
                        <%# Eval("surnameother")%><br>
                        <%# Eval("occupationother")%><br>
                        <%# Eval("affiliationother")%><br>
                        <%# Eval("emailother")%><br>
                    </ItemTemplate>
                </asp:Repeater>
            </div>

        </div>                
    </ItemTemplate>
</asp:Repeater>

コード ビハインドが行っていることは次のとおりです。

    private void BindData()
    {
        var rr = _sqlHelper.ExecuteReader(string.Format("select * from comment {0} order by created desc", Filter));

        var commentDt = new DataTable("Comments");
        commentDt.Columns.Add("id", Type.GetType("System.Int32"));
        commentDt.Columns.Add("nodeid", Type.GetType("System.Int32"));
        commentDt.Columns.Add("firstname", Type.GetType("System.String"));
        commentDt.Columns.Add("surname", Type.GetType("System.String"));
        commentDt.Columns.Add("occupation", Type.GetType("System.String"));
        commentDt.Columns.Add("affiliation", Type.GetType("System.String"));
        commentDt.Columns.Add("title", Type.GetType("System.String"));
        commentDt.Columns.Add("email", Type.GetType("System.String"));
        commentDt.Columns.Add("publishemail", Type.GetType("System.Boolean"));
        commentDt.Columns.Add("competinginterests", Type.GetType("System.Boolean"));
        commentDt.Columns.Add("competingintereststext", Type.GetType("System.String"));
        commentDt.Columns.Add("comment", Type.GetType("System.String"));
        commentDt.Columns.Add("statusid", Type.GetType("System.Int32"));
        commentDt.Columns.Add("spam", Type.GetType("System.Boolean"));
        commentDt.Columns.Add("ham", Type.GetType("System.Boolean"));
        commentDt.Columns.Add("created",Type.GetType("System.DateTime"));

        while (rr.Read())
        {
            var dr = commentDt.NewRow();
            dr["id"] = rr.GetInt("id");
            dr["nodeid"] = rr.GetInt("nodeid");
            dr["firstname"] = rr.GetString("firstname");
            dr["surname"] = rr.GetString("surname");
            dr["occupation"] = rr.GetString("occupation");
            dr["affiliation"] = rr.GetString("affiliation");
            dr["title"] = rr.GetString("title");
            dr["email"] = rr.GetString("email");
            dr["publishemail"] = rr.IsNull("publishemail") == true ? false : rr.GetBoolean("publishemail");
            dr["competinginterests"] = rr.IsNull("competinginterests") == true ? false : rr.GetBoolean("competinginterests");
            dr["competingintereststext"] = rr.GetString("competingintereststext");
            dr["comment"] = rr.GetString("comment");
            dr["statusid"] = rr.GetInt("statusid");
            dr["spam"] = rr.IsNull("spam") == true ? false : rr.GetBoolean("spam");
            dr["ham"] = rr.IsNull("ham") == true ? false : rr.GetBoolean("ham");
            dr["created"] = rr.GetDateTime("created");

            commentDt.Rows.Add(dr);


            /* My failing attempt at the second bind:
            var rrAuthor = _sqlHelper.ExecuteReader(string.Format("select * from CommentOtherAuthor WHERE commentid = 81"));

            var otherAuthorDt = new DataTable("OtherAuthors");
            otherAuthorDt.Columns.Add("firstname", Type.GetType("System.String"));
            otherAuthorDt.Columns.Add("surname", Type.GetType("System.String"));
            otherAuthorDt.Columns.Add("occupation", Type.GetType("System.String"));
            otherAuthorDt.Columns.Add("affiliation", Type.GetType("System.String"));
            otherAuthorDt.Columns.Add("email", Type.GetType("System.String"));

            while (rrAuthor.Read())
            {
                var drAuthor = otherAuthorDt.NewRow();
                drAuthor["firstnameother"] = rr.GetString("firstname");
                drAuthor["surnameother"] = rr.GetString("surname");
                drAuthor["occupationother"] = rr.GetString("occupation");
                drAuthor["affiliationother"] = rr.GetString("affiliation");
                drAuthor["emailother"] = rr.GetString("email");
                otherAuthorDt.Rows.Add(drAuthor);
            }
            rptAdditionalAuthors.DataBind();
            */
        }

        var pgitems = new PagedDataSource
            {
                DataSource = commentDt.DefaultView,
                AllowPaging = true,
                PageSize = 25,
                CurrentPageIndex = CurrentPage
            };

        rptComments.DataSource = pgitems;
        rptComments.DataBind();

        if (pgitems.PageCount > 1)
        {

            var pages = new ArrayList();
            for (var i = 0; i < pgitems.PageCount; i++)
                pages.Add((i + 1).ToString());

            rptPages.DataSource = pages;
            rptPages.DataBind();
            rptPages.Visible = true;
        }
        else
        {
            rptPages.Visible = false;

        }
    }

コード ビハインドは、セットアップした 2 番目のリピーターのために機能しませんが、最初のリピーターは、そのすべてを削除すると機能します。私の「ロジック」を確認できるように、そこに保存するのが最善だと思いました(おそらくあまり論理的ではありません;))。また、2 番目のデータ セットでは、ID 81 で追加の作成者の詳細を取得するようにハードコーディングしたことも注目に値します。これは、リピーターを機能させるためのものでした。ループ内の現在のコメントの作成者を取得します。

誰かがこの 2 番目のリピーターを機能させるのを手伝ってくれたら、とても感謝しています。現時点では、私の学習曲線の限界を超えています!

ありがとう!

4

1 に答える 1

3

これを含め、Nested リピーターに関するオンラインで入手できる記事がいくつかあります。

本質的には、最初に DataSet を作成し、コード ビハインドで DataTable 間の関係を定義してから、子リピーターを子行にバインドする必要があります。上記のリンク先の記事には、非常に簡単に変更できる完全に機能する例があります。

その記事がニーズに合わない場合は、次のいずれかを試してください。

于 2012-06-05T14:20:31.887 に答える