2015-03-27 3 views
0

Я возвращаю значения из базы данных в DataTable. В базе данных у меня есть 5 значений, и если я запускаю запрос в Management Studio, я получаю ожидаемый результат. Однако мой вопрос при возвращении их с помощью функции C# Я получаю 9 значенийDatatable возвращает больше строк, чем необходимо

protected static DataTable GetData() 
{ 
    using (SqlConnection con = new SqlConnection(Common.ConnectionString)) 
    { 

     string myQuery = "SELECT MESSAGE FROM MYTABLE ORDER BY CREATEDATE DESC"; 
     using (SqlCommand cmd = new SqlCommand(sqlQuery, con)) 
     { 
      using (SqlDataAdapter sda = new SqlDataAdapter()) 
      { 
       con.Open(); 
       sda.SelectCommand = cmd; 
       DataTable dt = new DataTable(); 
       sda.Fill(dt); 
       return dt; 
      } 
     } 
    } 
} 

И для отображения этого я вложенный asp Repeater, которые имеют следующие

<asp:Repeater ID="Repeater1" runat="server"> 
    <HeaderTemplate> 
     <table id="myt"> 
      <tr> 
       <th>Message 
       </th> 
      </tr> 
    </HeaderTemplate> 
    <ItemTemplate> 
     <tr> 
      <td class="sendbubble"> 
       <%# DataBinder.Eval(Container.DataItem, "MESSAGE") %> 
      </td> 
      <asp:Repeater ID="InnerRepeater" runat="server"> 
       <ItemTemplate> 
        <tr> 
         <td class="receivebubble" style="color: #ffffff;"> 
          <%# DataBinder.Eval(Container.DataItem,"MESSAGE") %> 
         </td> 
        </tr> 
       </ItemTemplate> 
      </asp:Repeater> 
     </tr> 
    </ItemTemplate> 
</asp:Repeater> 

Я не понимаю, почему в Repeater1 я получаю повторяющиеся значения. В Page_Load у меня есть

Repeater1.DataSource = GetData(); 
Repeater1.DataBind(); 

3 Значения из диспетчера 2 От Работника

Эти значения разделяются Flag столбца, который содержит данные либо manager или employee

Заранее спасибо за все ваши помощь и поддержка

+1

Почему вы должны 'DataSource =" <% # GetData()%> ', а также 'Repeater1.DataSource = GetData();'? Также вы получаете 9 строк с нечетным числом, что он содержит? –

+0

Вы вызываете GetData() дважды, один раз в коде b ehind и один раз в синтаксисе связывания данных aspx. Я бы не ожидал, что дублировать значения, но вы не должны дважды определять DataSource. – Gridly

+0

@TimSchmelter Я только что удалил 'DataSource = '<% # GetData()%>', но у меня все еще есть такая же проблема – Izzy

ответ

1

В первом повторителе вам нужно загрузить только 2 флажка. Для каждого флага у вас есть еще один ретранслятор, в котором вы создаете строки с соответствующими сообщениями.

Вид: за

<asp:Repeater ID="pageList" runat="server" OnItemDataBound="pageList_ItemDataBound"> 
       <HeaderTemplate> 
        <table id="myt"> 
         <tr> 
          <th>Message 
          </th> 
         </tr> 
       </HeaderTemplate> 
       <ItemTemplate> 
        <tr> 
         <asp:Repeater ID="itemRepeater" runat="server"> 
          <ItemTemplate> 
           <tr> 
            <td class="receivebubble" style="color: #ffffff;"> 
             <%# DataBinder.Eval(Container.DataItem,"MESSAGE") %> 
            </td> 
           </tr> 
          </ItemTemplate> 
         </asp:Repeater> 
        </tr> 
       </ItemTemplate> 
      </asp:Repeater> 

Код:

protected void Page_Load(object sender, EventArgs e) 
     { 
      pageList.DataSource = GetFlags(); 
      pageList.DataBind(); 
     } 

     protected void pageList_ItemDataBound(object sender, RepeaterItemEventArgs e) 
     { 
      RepeaterItem item = e.Item; 
      Repeater itemRepeater = (Repeater) e.Item.FindControl("itemRepeater"); 

      switch (item.ItemType) 
      { 
       case ListItemType.Header: 
        break; 
       case ListItemType.Item: 
       case ListItemType.AlternatingItem: 
        if (itemRepeater != null) 
        { 
         var flagType = (item.DataItem as DataRowView).Row["Flag"].ToString(); 
         DataTable repeaterData = GetData(flagType); 
         itemRepeater.DataSource = repeaterData; 
         itemRepeater.DataBind(); 
        } 
        break; 
       case ListItemType.Footer: 
        break; 
      } 
     } 

Бизнес:

private static DataTable GetData(string flagType) 
     { 
      using (SqlConnection con = new SqlConnection("...")) 
      { 

       string myQuery = "SELECT MESSAGE FROM MYTABLE WHERE Flag = " + flagType + " ORDER BY CREATEDATE DESC"; 
       using (SqlCommand cmd = new SqlCommand(myQuery, con)) 
       { 
        using (SqlDataAdapter sda = new SqlDataAdapter()) 
        { 
         con.Open(); 
         sda.SelectCommand = cmd; 
         DataTable dt = new DataTable(); 
         sda.Fill(dt); 
         return dt; 
        } 
       } 
      } 
     } 

     private static DataTable GetFlags() 
     { 
      using (SqlConnection con = new SqlConnection("...")) 
      { 

       string myQuery = "SELECT DISTINCT Flag FROM MYTABLE"; 
       using (SqlCommand cmd = new SqlCommand(myQuery, con)) 
       { 
        using (SqlDataAdapter sda = new SqlDataAdapter()) 
        { 
         con.Open(); 
         sda.SelectCommand = cmd; 
         DataTable dt = new DataTable(); 
         sda.Fill(dt); 
         return dt; 
        } 
       } 
      } 
     } 
+0

Просто использовал ваш код, но у меня все еще есть одна и та же проблема. В 'asp Repeater' по-прежнему отображается 9 – Izzy