Как создать таблицу из трех столбцов в ASP.Net Repeater

Я хотел бы иметь возможность использовать элемент управления ASP.Net Repeater для создания таблицы HTML, содержащей три столбца и столько строк, сколько необходимо. .

Например, если бы данные выглядели так

"Фил Хьюз"

"Энди Петит"

"CC Sabathia"

"AJ Burnett"

"Хавьер Васкес"

Мне бы хотелось, чтобы итоговая таблица была похожа на

<table>
 <tr>
  <td>Phil Hughes</td>
  <td>Andy Petite</td>
  <td>CC Sabathia</td>
 </tr>
 <tr>
  <td>AJ Burnett</td>
  <td>Javier Vazquez</td>
  <td></td>
 </tr>
</table>

. Как мне это сделать?

16
задан Brian Tompsett - 汤莱恩 9 June 2017 в 12:55
поделиться

3 ответа

Лучше использовать элемент управления DataList, так как он имеет интересные свойства RepeatColumns и RepeatDirection.

15
ответ дан 30 November 2019 в 15:32
поделиться

Repeater - не идеальный элемент управления для этого. Если вы используете .NET 3.5, вам следует использовать ListView вместо него. Вот пример, который делает то, о чем вы просите.

<asp:ListView ID="myListView" runat="server" 
   DataSourceID="YOURDATASOURCE" GroupItemCount="3">

   <LayoutTemplate>
      <table>
         <tr>
            <td>
               <table border="0" cellpadding="5">
                  <asp:PlaceHolder runat="server" ID="groupPlaceHolder"></asp:PlaceHolder>
               </table>
            </td>
         </tr>
      </table>
   </LayoutTemplate>

   <GroupTemplate>
      <tr>
         <asp:PlaceHolder runat="server" ID="itemPlaceHolder"></asp:PlaceHolder>
      </tr>
   </GroupTemplate>

   <ItemTemplate>
      <td>
         <%# Eval("FullName") %>
      </td>
   </ItemTemplate>
</asp:ListView>
20
ответ дан 30 November 2019 в 15:32
поделиться

Я предполагаю, что у вас есть все эти имена в 5 строках данных, и вы хотите распределить их по 3 столбцам в репитере, а не иметь 2 строки данных с 3 полями, что было бы просто. Исходя из моего предположения, ваши данные выглядят примерно так:

DataTable (или любой другой источник):

ID      Name
---------------
1       Bob
2       John
3       Joe
4       Mary
5       Mike

Вы можете сделать это с помощью Repeater и Literal с небольшой логикой в ​​событии OnDataBinding в Literal .

Сначала определите свой Repeater :

<asp:Repeater ID="repeater" runat="server">
    <HeaderTemplate>
        <table>
    </HeaderTemplate>
    <ItemTemplate>
        <asp:Literal ID="litItem" runat="server" OnDataBinding="litItem_DataBinding" />
    </ItemTemplate>
    <FooterTemplate>
        </table>
    </FooterTemplate>
</asp:Repeater>

Затем вам понадобится константа для всех столбцов, которые вам нужны, и две глобальные переменные для отслеживания операции привязки. Определите их так:

public partial class _YourPage : System.Web.UI.Page
{
    private const int _repeaterTotalColumns = 3;
    private int _repeaterCount = 0;
    private int _repeaterTotalBoundItems = 0;

Затем вам нужно будет реализовать OnDataBinding для выполнения всей настраиваемой работы:

protected void litItem_DataBinding(object sender, System.EventArgs e)
{
    Literal lt = (Literal)(sender);
    _repeaterCount++;            
    if (_repeaterCount % _repeaterTotalColumns == 1)
    {
        lt.Text = "<tr>";
    }

    lt.Text += string.Format("<td>{0}</td>", Eval("Name").ToString());

    if (_repeaterCount == _repeaterTotalBoundItems)
    {
        // Last item so put in the extra <td> if required
        for (int i = 0;
             i < (_repeaterTotalColumns - (_repeaterCount % _repeaterTotalColumns));
             i++)
        {
            lt.Text += "<td></td>";
        }
        lt.Text += "</tr>";
    }

    if (_repeaterCount % _repeaterTotalColumns == 0)
    {
        lt.Text += "</tr>";
    }
}

Затем убедитесь, что при привязке вашего Repeater вы сохраняете общее количество:

 _repeaterTotalBoundItems = yourDataTable.Rows.Count;
 repeater.DataSource = yourDataTable;
 repeater.DataBind();

Результатом будет:

<table>    
<tr><td>Bob</td>
<td>John</td>
<td>Joe</td></tr>
<tr><td>Mary</td>
<td>Mike</td><td></td></tr>
</table>

Вы, вероятно, могли бы улучшить код DataBinding , но я просто перебил его, чтобы дать основную предпосылку того, как достичь вашей цели. Если DataBinding требует выполнения большого количества операций объединения строк, вам, вероятно, следует переключиться на использование StringBuilder , а затем просто назначить Literal в последней операции .

0
ответ дан 30 November 2019 в 15:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: