Я изучаю .NET на данный момент, так что простите меня, если это глупый вопрос.Повторите репликатор данных внутри репитера данных в ASP.NET
У меня есть две таблицы MSSQL, одна называется «Комментарий», а другая - «CommentAdditionalAuthor». В таблице комментариев содержатся данные из формы комментария, такие как название комментария, дата, имя основного автора и т. Д. В таблице CommentAdditionalAuthor содержится информация о других авторах, внесших свой вклад в комментарий. Таким образом, существует взаимосвязь «один ко многим» - каждый комментарий может иметь один или несколько дополнительных авторов.
У меня есть элемент управления ретранслятора, который связывает данные из таблицы комментариев, которая работает хорошо. Теперь то, что я хочу сделать, выдает данные автора вместе с комментарием. Так эффективно ретранслятор внутри ретранслятора.
Я пытался очистить этот код как можно больше, но сожалею, что он все еще довольно длинный, поскольку я хотел бы учесть его в отношении того, что я делаю, поэтому я могу, надеюсь, понять это решение. Найдя другие примеры этого, я изо всех сил пытаюсь их реализовать, поскольку они привязываются к данным по-разному, и я просто не могу работать в своем приложении.
код в файле 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;
}
}
Код-за материал не работает из-за второй ретранслятор, который я установил, но первый повторитель работает, если я удалю все это. Я думал, что лучше держать его там, чтобы вы могли видеть мою «логику» (возможно, не очень логичную;)). Также стоит отметить, что во втором наборе данных я жестко запрограммировал его, чтобы получить дополнительные данные автора с идентификатором 81 - это было просто для того, чтобы заставить ретранслятор работать - очевидно, мне нужно подставить это значение id из таблицы комментариев, чтобы авторы получили текущий комментарий в цикле.
Если кто-нибудь может помочь мне получить эту вторую работу ретранслятора, я был бы очень благодарен. На данный момент это край моей кривой обучения!
Спасибо, ребята!
Спасибо. Эта первая статья - это та, которую я пытаюсь выполнить, но я просто не могу заставить ее работать - кажется, она использует кучу новых вещей, таких как SQLDataAdapter, которых нет в моем приложении, и я не понимаю их хорошо достаточно знать, что делает каждая часть, и что эквивалент в моем примере. Однако я посмотрю на вашу вторую ссылку. – Dan
DataAdatper используется для заполнения DataSet, который создает встроенную память ваших данных. Вы используете SqlDatareader, который позволяет вам перебирать записи по одному за раз. Это два разных подхода к извлечению данных. Для выполнения вложенных репитеров самым простым способом является использование DataAdapters. Подождите, и я найду вам краткую статью, в которой будет различие. это не должно быть слишком сложно переключиться. – David
Заполнение набора данных с помощью DataAdapter: http://msdn.microsoft.com/en-us/library/bh8kx08z.aspx – David