2016-03-23 2 views
3

DataTable (уже отсортированы по Ee):Как отделить DataTable колонкой и сохранить его для последующего использования

Title   EventDate     EndDate 
Testing 1  3/23/2016 11:00:00 AM  3/23/2016 12:00:00 PM 
Testing 2  3/23/2016 5:00:00 PM  3/23/2016 6:00:00 PM 
Testing 9  3/24/2016 4:00:00 PM  3/24/2016 5:00:00 PM 
Testing 5  3/29/2016 11:00:00 AM  3/29/2016 12:00:00 PM 
Testing 6  3/29/2016 11:00:00 AM  3/29/2016 12:00:00 PM 
Testing 4  3/29/2016 1:00:00 PM  3/29/2016 2:00:00 PM 

ASP.net Label:

<asp:Label ID="lDates" runat="server"></asp:Label> 

Как я могу закодировать так, (это может быть не так, но я могу разделить их по датам и отображению в разных местах):

3/23: Testing 1 
     Testing 2 

3/24: Testing 9 

3/29: Testing 5 
     Testing 6 
     Testing 4 
+0

GridView? Repeater? – JCM

+0

Я могу использовать ретранслятор, но как отделить DataTable. – Si8

+0

ну, попробуйте создать еще один 'DataTable', используя' distinct', зацикливайте на этой таблице и собирайте значения из первого ...немного беспорядочно, но это могло бы сработать. – nelek

ответ

3

Я делаю это, зацикливая корыто DataTable, получить текущий EventDate и проверить его с предыдущим.

Это vb.net код:

'get first date from table in format day.month - adapt to Your date format  
    Dim pDT As String = String.Format("{0:dd.MM}", dt.Rows(0)("EventDate")) 
    Dim res As String = "<table cellspacing=0 cellpadding=0><tr><td style='text-align:left;vertical-align:top;border-bottom:solid 1px gray;'>" + pDT + "</td><td style='text-align:left;vertical-align:top;padding-bottom:10px;border-bottom:solid 1px gray;padding-left:10px;'>" + dt.Rows(0)("Title") + "<br>" 
For x = 1 To dt.Rows.Count - 1 
    'get EventDate from current row 
    Dim nD As String = String.Format("{0:dd.MM}", dt.Rows(x)("EventDate")) 
    If nD <> pDT Then 
     res += "<td></tr>" 
     pDT = String.Format("{0:dd.MM}", dt.Rows(x)("EventDate")) 
     res += "<tr><td style='text-align:left;vertical-align:top;border-bottom:solid 1px gray;'>" + pDT + "</td><td style='text-align:left;vertical-align:top;padding-bottom:10px;border-bottom:solid 1px gray;padding-left:10px;'>" + dt.Rows(x)("Title") + "<br>" 
    Else 
     res += dt.Rows(x)("Title") + "<br>" 
    End If 
Next 
res += "</td></tr></table>" 
lDates.Text = res 

Поскольку я не использую c# ниже код преобразуется онлайн конвертер (я надеюсь, что это правильное преобразование :():

string pDT = string.Format("{0:dd.MM}", dt.Rows[0]["EventDate"]); 
       string res = "<table cellspacing=0 cellpadding=0><tr><td style='text-align:left;vertical-align:top;border-bottom:solid 1px gray;'>" + pDT + "</td><td style='text-align:left;vertical-align:top;padding-bottom:10px;border-bottom:solid 1px gray;padding-left:10px;'>" + dt.Rows[0]["Title"] + "<br>"; 
       for (int x = 1; x <= dt.Rows.Count - 1; x++) 
       { 
        string nD = string.Format("{0:dd.MM}", dt.Rows[x]["EventDate"]); 
        if (nD != pDT) 
        { 
         res += "<td></tr>"; 
         pDT = string.Format("{0:dd.MM}", dt.Rows[(x]["EventDate"]); 
         res += "<tr><td style='text-align:left;vertical-align:top;border-bottom:solid 1px gray;'>" + pDT + "</td><td style='text-align:left;vertical-align:top;padding-bottom:10px;border-bottom:solid 1px gray;padding-left:10px;'>" + dt.Rows[x]["Title"] + "<br>"; 
        } 
        else 
        { 
         res += dt.Rows[x]["Title"] + "<br>"; 
        } 
       } 
       res += "</td></tr></table>"; 
       lDates.Text = res; 

Это немногочисленный грязный код.

Обновление (заполнение Repeater):

Затем вы должны создать новый, пустой, DataTable и использовать почти тот же код, но вместо этого вместо значений в string поместите их отдельно в новый DataTable (с 2 столбцами, один для даты и другой для титров) :

отделенного кода (vb.net):

Dim newDT As New DataTable 
      newDT.Columns.Add("Date", GetType(String)) 
      newDT.Columns.Add("Titles", GetType(String)) 
      Dim pDT = String.Format("{0:dd.MM}", dt.Rows(0)("EventDate")) 
      Dim titles As String = dt.Rows(0)("Title") + "," 
      For x = 1 To dt.Rows.Count - 1 
       Dim nD = String.Format("{0:dd.MM}", dt.Rows(x)("EventDate")) 
       If pDT <> nD Then 
        titles = Mid(titles, 1, Len(titles) - 1) 
        newDT.Rows.Add({pDT, String.Join("<br>", titles.Split(",").ToArray)}) 
        pDT = String.Format("{0:dd.MM}", dt.Rows(x)("EventDate")) 
        titles = dt.Rows(x)("Title") + "," 
       Else 
        titles += dt.Rows(x)("Title") + "," 
       End If 
      Next 
      titles = Mid(titles, 1, Len(titles) - 1) 
      newDT.Rows.Add({pDT, String.Join("<br>", titles.Split(",").ToArray)}) 
      rptDate.DataSource = newDT 
      rptDate.DataBind() 

отделенного кода (c#) (пс Я не уверен, что это правильное преобразование. извините, опять же, я очень очень слабый с c# :():

DataTable newDT = new DataTable(); 
newDT.Columns.Add("Date", typeof(string)); 
newDT.Columns.Add("Titles", typeof(string)); 
string pDT = string.Format("{0:dd.MM}", dt.Rows[0]["EventDate"]); 
string titles = dt.Rows[0]("Title") + ","; 
for (x = 1; x <= dt.Rows.Count - 1; x++) { 
    string nD = string.Format("{0:dd.MM}", dt.Rows[0]["EventDate"]); 
    if (pDT != nD) { 
     titles = Strings.Mid(titles, 1, Strings.Len(titles) - 1); 
     newDT.Rows.Add({ 
      pDT, 
      string.Join("<br>", titles.Split(",").ToArray) 
     }); 
     pDT = string.Format("{0:dd.MM}", dt.Rows[x]("EventDate")); 
     titles = dt.Rows[x]("Title") + ","; 
    } else { 
     titles += dt.Rows[x]("Title") + ","; 
    } 
} 
titles = Strings.Mid(titles, 1, Strings.Len(titles) - 1); 
newDT.Rows.Add({ 
    pDT, 
    string.Join("<br>", titles.Split(",").ToArray) 
}); 
rptDate.DataSource = newDT; 
rptDate.DataBind(); 

ASPX:

<asp:Repeater runat="server" ID="rptDate"> 
      <HeaderTemplate> 
       <table cellpadding="0" cellspacing="0"> 
      </HeaderTemplate> 
      <ItemTemplate> 
       <tr> 
        <td class="td1"> 
         <%# Container.DataItem("Date")%> 
        </td> 
        <td class="td2"> 
         <%# Container.DataItem("Titles")%> 
        </td> 
       </tr> 
      </ItemTemplate> 
      <FooterTemplate> 
       </table> 
      </FooterTemplate> 
     </asp:Repeater> 

CSS:

.td1, .td2 {width:250px; border-bottom:solid 1px gray; text-align:left; vertical-align:top;} 
.td1 {font-weight:bold;} 
.td2 {font-style:italic;} 
+0

Спасибо. Он работает как ожидалось :). Мне просто нужно выяснить, добавление в ретранслятор сейчас. – Si8

+0

Вот мой ретранслятор ... https://jsfiddle.net/bkasxw9x/. Я использую DIV, чтобы сделать его отзывчивым. Если вы в состоянии помочь мне, это будет здорово. Текущий ретранслятор показывает только одну дату для каждого раздела. – Si8

+2

@ Si8 Я просто обновляю свой ответ. Я использую 'table', но вы можете изменить его на' tag'. Это вам нужно. Речь идет о новых 'DataTable' (в codebehind) и' <% # Container.DataItem («Имя_поля»)%> 'в aspx в' Repeater'. –

0
var groupedObjectList = from DataRow r in ds.Tables[0].Rows 
            group r by r.Field<DateTime>("EventDate") into g 
            select new { EventDate = g.Key, Items = g.ToList() }; 
+0

Если у меня есть ретранслятор, и я бы хотел использовать его для каждого 'groupedObjectList', как я могу это сделать? Это DataTable, а не DataSet. – Si8

+0

В событии ItemDataBound для Repeater вы можете получить значение Data like: ((dynamic) (e.Item.DataItem)). EventDate –

+0

И установить текст в дочернем контроле, например ((Ярлык) e.Item.FindControl ("lblRepeater")) .text –

1
protected void rptTeste_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     ((Label)e.Item.FindControl("lblRepeater")).Text = ((DateTime)((dynamic)(e.Item.DataItem)).EventDate).ToString("MM/dd"); 
    } 
+0

Вот ретранслятор: https://jsfiddle.net/bkasxw9x/. Не могли бы вы помочь мне в этом. – Si8

1

в .aspx файл:

<asp:Repeater ID="rptCalendar" runat="server" ClientIDMode="Static" OnItemDataBound="rptCalendar_ItemDataBound"> 
<HeaderTemplate> 
    <div class="calEvParent widthFull hidOverflow" style="padding: 0 0 8px 0;"> 
</HeaderTemplate> 
<ItemTemplate> 
    <div class="calEvHolder width98 hidOverflow" style="height: 55px; background-color: rgb(255, 255, 255); box-shadow: 0px 0px 5px rgb(51, 51, 51); box-shadow: 0px 0px 5px rgba(51, 51, 51, 0.7); margin: 10px 0 0 1%;"> 
     <div class="calEvDateHolder floatL hidOverflow heightFull" style="width: 25%;"> 
      <div class="calEvDate widthFull heightFull hidOverflow dispIB textC"> 
       <span style="font-size: 32px; line-height: 1; font-weight: 300; font-family: 'Lato';"><%# Eval("EventDate", "{0:dd}") %></span> 
       <br /> 
       <span style="font-size: 16px; line-height: 1; font-weight: 800; font-family: 'Lato';"> 
        <%# Convert.ToDateTime(Eval("EventDate")).ToString("MMM") %> 
       </span> 
      </div> 

     </div> 
     <div style="float: left; width: 72%; height: 100%; padding: 0 0 0 2%; overflow: hidden;"> 
     <asp:DataList runat="server" ID="dtList"> 
      <ItemTemplate> 
       <h2 style="font-size: 17px; font-weight: 700; margin: 0px; font-family: 'Lato';"><%# Eval("Title") %></h2> 
       <span style="font-size: .6em;"><%# Eval("Location") %></span> 
      </ItemTemplate> 
     </asp:DataList>    
     </div> 
    </div> 
</ItemTemplate> 
<FooterTemplate> 
    </div> 
</FooterTemplate> 

И установить ретранслятор DataSource:

var groupedObjectList = from DataRow r in ds.Tables[0].Rows 
           group r by r.Field<DateTime>("EventDate") into g 
           select new { EventDate = g.Key, Items = g.Select(i => new { Title = i.Field<string>("Title"), Location = i.Field<string>("Location") }).ToList() }; 

     rptCalendar.DataSource = groupedObjectList; 
     rptCalendar.DataBind(); 

И rptCalendar_ItemDataBound Событие:

protected void rptCalendar_ItemDataBound(object sender, RepeaterItemEventArgs e) 
    { 
     if (e.Item.ItemType == ListItemType.Item) 
     { 
      DataList itemList = ((DataList)e.Item.FindControl("dtList")); 
      itemList.DataSource = ((dynamic)(e.Item.DataItem)).Items; 
      itemList.DataBind(); 
     } 
    } 
+0

Надеюсь, помог .. –

Смежные вопросы