gpt4 book ai didi

asp.net - 在 ASP.NET 中的数据中继器内绑定(bind)数据中继器

转载 作者:行者123 更新时间:2023-12-04 05:44:12 25 4
gpt4 key购买 nike

我现在正在学习.NET,如果这是一个愚蠢的问题,请原谅我。

我有两个 MSSQL 表,一个称为“Comment”,另一个称为“CommentAdditionalAuthor”。 Comment 表包含来自评论表单的数据,例如评论标题、日期、主要作者姓名等。CommentAdditionalAuthor 表包含有关对评论做出贡献的其他作者的信息。所以那里是一对多的关系——每条评论都可以有一个或多个额外的作者。

我有一个转发器控件,它绑定(bind)来自 Comment 表的数据,效果很好。现在我想做的是在评论旁边输出作者的详细信息。如此有效地成为中继器中的中继器。

我已尝试尽可能多地清理此代码,但很抱歉它仍然很长,因为我想让它与我正在做的事情保持相关,以便我希望能够理解解决方案。找到了其他示例后,我正在努力实现它们,因为它们以不同的方式绑定(bind)到数据,而我无法在我的应用程序中使用。

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;

}
}

由于我设置了第二个中继器,代码隐藏的东西不起作用,但是如果我删除所有这些东西,第一个中继器确实可以工作。我认为最好将其保留在那里,这样您就可以看到我的“逻辑”(可能不是很合乎逻辑;))。另外值得注意的是,在第二个数据集中,我对其进行了硬编码,以获取 id 为 81 的其他作者详细信息——这只是为了让中继器工作——显然我需要用 Comment 表中的 id 值替换它,获取循环中当前评论的作者。

如果有人可以帮助我使第二个中继器正常工作,我将不胜感激。目前它已经超出了我的学习曲线的边缘!

谢谢各位!

最佳答案

有几篇关于嵌套中继器的在线文章,包括 this one .

本质上,您需要首先创建 DataSet 并在代码隐藏中定义 DataTables 之间的关系,然后将子转发器绑定(bind)到子行。上面链接的文章有一个完整的工作示例,很容易修改。

如果该文章不适合您的需要,请尝试 one of these .

关于asp.net - 在 ASP.NET 中的数据中继器内绑定(bind)数据中继器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10899062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com