2012-06-05 4 views
2

Я изучаю .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") %>&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; 

     } 
    } 

Код-за материал не работает из-за второй ретранслятор, который я установил, но первый повторитель работает, если я удалю все это. Я думал, что лучше держать его там, чтобы вы могли видеть мою «логику» (возможно, не очень логичную;)). Также стоит отметить, что во втором наборе данных я жестко запрограммировал его, чтобы получить дополнительные данные автора с идентификатором 81 - это было просто для того, чтобы заставить ретранслятор работать - очевидно, мне нужно подставить это значение id из таблицы комментариев, чтобы авторы получили текущий комментарий в цикле.

Если кто-нибудь может помочь мне получить эту вторую работу ретранслятора, я был бы очень благодарен. На данный момент это край моей кривой обучения!

Спасибо, ребята!

ответ

3

На вложенных ретрансляторах имеется несколько статей, в том числе this one.

По сути, вам необходимо сначала создать свой DataSet и определить отношения между DataTables в коде, а затем привязать дочерний повторитель к дочерним строкам. В приведенной выше статье приведен полный рабочий пример, который легко модифицировать.

если эта статья вам не подходит, попробуйте one of these.

+0

Спасибо. Эта первая статья - это та, которую я пытаюсь выполнить, но я просто не могу заставить ее работать - кажется, она использует кучу новых вещей, таких как SQLDataAdapter, которых нет в моем приложении, и я не понимаю их хорошо достаточно знать, что делает каждая часть, и что эквивалент в моем примере. Однако я посмотрю на вашу вторую ссылку. – Dan

+1

DataAdatper используется для заполнения DataSet, который создает встроенную память ваших данных. Вы используете SqlDatareader, который позволяет вам перебирать записи по одному за раз. Это два разных подхода к извлечению данных. Для выполнения вложенных репитеров самым простым способом является использование DataAdapters. Подождите, и я найду вам краткую статью, в которой будет различие. это не должно быть слишком сложно переключиться. – David

+0

Заполнение набора данных с помощью DataAdapter: http://msdn.microsoft.com/en-us/library/bh8kx08z.aspx – David