Asp.net вложенный повторитель с переменными столбцами / строками - PullRequest
0 голосов
/ 20 марта 2019

Я хочу отобразить своего рода список людей и некоторую информацию, связанную с днем ​​месяца в выбранном интервале, например:

Emp.   | 01   | 02   | 03   |
Albert | aaa  | bbb  | ccc  |
Dana   | ccc  | aaa  | bbb  |
John   | bbb  | ccc  | aaa  |

Я настроил ретранслятор так:

<asp:TextBox ID="txtDataDa" Type="date" runat="server" ToolTip="Data Da" autocomplete="off"></asp:TextBox>
<asp:TextBox ID="txtDataA" Type="date" runat="server" ToolTip="Data A" autocomplete="off"></asp:TextBox>
<asp:Button ID="btnVai" runat="server" Text="Vai" OnClick="btnVai_Click"/>

        <asp:Repeater ID="rptParent" runat="server">
                        <HeaderTemplate>
                            <table style="width: 100%;">
                                <tr>
                                    <td>Dip</td>
                        </HeaderTemplate>
                        <ItemTemplate>
                            <td>
                                <asp:Label ID="lblGiorno" Text='<%# DataBinder.Eval(Container.DataItem, "data", "{0:dd}")%>' runat="server" />
                            </td>
                            <%--<asp:Repeater ID="rptChild" runat="server">
                                <ItemTemplate>
                                </ItemTemplate>
                            </asp:Repeater>--%>
                        </ItemTemplate>
                        <FooterTemplate>
                            </tr>
                        </table>
                        </FooterTemplate>
                    </asp:Repeater>

Бит Eval внутри метки получает день из таблицы данных, сгенерированной из начальной и конечной даты, установленной с помощью элемента управления 2 календаря. Я управляю этим с помощью этого бита в коде:

Protected Sub btnVai_Click(sender As Object, e As EventArgs)
        Dim data1, data2 As DateTime
        data1 = Date.ParseExact(txtDataDa.Text, "yyyy-MM-dd", CultureInfo.CreateSpecificCulture("en-US")).Date
        data2 = Date.ParseExact(txtDataA.Text, "yyyy-MM-dd", CultureInfo.CreateSpecificCulture("en-US")).Date

        Dim dtGiorni As New DataTable
        ' Define columns
        dtGiorni.Columns.Add("data", GetType(System.DateTime))
        dtGiorni.Columns.Add("giorno", GetType(System.String))
        ' Add a row of data
        Dim data As DateTime = data1.AddDays(-1)
        Dim ita As Globalization.CultureInfo = New Globalization.CultureInfo("it-IT")

        While data < data2
            data = data.AddDays(1)
            Dim nomeGiorno As String = ita.DateTimeFormat.GetDayName(data.DayOfWeek)
            dtGiorni.Rows.Add(data, nomeGiorno.Substring(0, 1).ToUpper() + nomeGiorno.Substring(1))
        End While

        rptParent.DataSource = dtGiorni
        rptParent.DataBind()
    End Sub

Если я выберу 1-е марта и 31-е марта, все столбцы заголовков будут отображаться правильно с указанным днем. Теперь я хочу создать неопределенное количество строк на основе результата запроса mssql, чтобы отобразить людей в первом столбце и всю информацию в нужный день. Я думаю, что мне нужно использовать вложенный повторитель, но я не знаю, как настроить его с остальной частью таблицы. Любая помощь, пожалуйста? Спасибо

EDIT: Я не против использовать другой метод вместо повторителя, но, пожалуйста, дайте подсказку, чтобы начать

1 Ответ

0 голосов
/ 20 марта 2019

Я бы так не поступил без главной причины.

Я бы либо использовал GridView с AutoGenerateColumns, установленной в true, либо полностью собрал бы html на сервере (чтобы поместить его в литерал, определенный в aspx).

Технически это можно сделать с помощьюПовторитель, но это будет много дополнительной работы за небольшую награду.И не будет очень читабельный код.

Редактировать: Как подключить сетку

<asp:TextBox ID="txtDataDa" Type="date" runat="server" ToolTip="Data Da" autocomplete="off"></asp:TextBox>
<asp:TextBox ID="txtDataA" Type="date" runat="server" ToolTip="Data A" autocomplete="off"></asp:TextBox>
<asp:Button ID="btnVai" runat="server" Text="Vai" OnClick="btnVai_Click"/>
<asp:gridview id="grdList" runat="server" autogeneratecolumns="True" 
        emptydatatext="No data available." useaccessibleheader="false" >
</asp:gridview>

Тогда для кода позади:

  Protected Sub btnVai_Click(sender As Object, e As EventArgs)
        Dim data1, data2 As DateTime
        data1 = Date.ParseExact(txtDataDa.Text, "yyyy-MM-dd", CultureInfo.CreateSpecificCulture("en-US")).Date
        data2 = Date.ParseExact(txtDataA.Text, "yyyy-MM-dd", CultureInfo.CreateSpecificCulture("en-US")).Date

       Using cn As New ODBCDataConnection(conString)
          cn.open
          Using cmd As OdbcCommmand = cn.createcommand

          cmd.commandtext = "your mysql statement"
          // Use parameters for date range

          grdList.DataSource = cmd.ExecuteReader()
          grdList.DataBind()

          end using
       End Using

    End Sub

Pivot поможет вам структурировать ваши данные.docs.microsoft.com/en-us/sql/t-sql/queries/....

Изменяет глубокую таблицу на широкую, а с помощью динамического sql вы можете иметь переменное число столбцов в сводной таблице.stackoverflow.com/questions/198716/pivot-in-sql-2005#199763

...