私は現在 .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") %> </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 番目のリピーターを機能させるのを手伝ってくれたら、とても感謝しています。現時点では、私の学習曲線の限界を超えています!
ありがとう!