ASP.net - не знаете, как создать таблицу - PullRequest
0 голосов
/ 23 августа 2010

С учетом следующего HTML:

<asp:content id="Content1" contentplaceholderid="mainContent" runat="server">

<div class="scrollRow">
    <table width="100%">
        <tr>
            <td width="25%">Site name: <b>My site</b></td>
            <td>Created on 12th Aug 2010</td>
            <td align="right"><button onclick="doRevert(1)">Revert to this</button></td>
        </tr>
    </table>
</div>

<div class="scrollRow">
    <table width="100%">
        <tr>
            <td width="25%">Site name: <b>Another site</b></td>
            <td>Created on 3rd Aug 2010</td>
            <td align="right"><button onclick="doRevert(1)">Revert to this</button></td>
        </tr>
    </table>
</div>

<div class="scrollRow scrollRowOn">
    <table width="100%">
        <tr>
            <td width="25%">Site name: <b>Another site</b></td>
            <td>Created on 3rd Aug 2010</td>
            <td align="right"></td>
        </tr>
    </table>
</div>

</asp:content>

Что такое список строк, как мне программно создать их после получения строк SQL из кода? Нужно ли мне самому управлять или что-то в этом роде?

Ответы [ 3 ]

3 голосов
/ 23 августа 2010

Попробуйте что-нибудь вроде этого:

    <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_OnItemDataBound">
    <ItemTemplate>
        <div class='<%# SetClass(Eval("SiteId")) %>'>
            <table width="100%">
              <tr>
                   <td width="25%">Site name: <b><%# Eval("SiteName") %></b></td>
                   <td>Created on <%# DataBinder.Eval(Container.DataItem, "CreateDate", "{0:dd MMM yyyy}")%></td>
                    <td align="right"><button id="btnRevert" runat="server" onclick="doRevert(1)">Revert to this</button></td>
            </tr>
            </table>
          </div>
        </ItemTemplate>
   </asp:Repeater>

В событии codebehind Repeater1_OnItemDataBound вы можете установить, будет ли кнопка видимой или нет, в зависимости от того, является ли элемент текущим.

    protected void Repeater1_OnItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        RepeaterItem item = e.Item;
        if (item.ItemType == ListItemType.AlternatingItem || item.ItemType == ListItemType.Item)
        {
            Site site = e.Item.DataItem as Site; //List<Site> is what you are binding to the repeater
            if (site.SiteId == currentSiteId)
            {
                var btn = e.Item.FindControl("btnRevert") as Button;
                if (btn != null)
                {
                    btn.Visible = false;
                }
            }
        }
    } 

CSS-классы для ваших предметов могут быть установлены так:

    protected string SetClass(object obj) {
        int siteId;
        if (int.TryParse(obj.ToString(), out siteId)){
            if (siteId == currentSiteId) //currentSiteId determined elsewhere
            {
                return "scrollRow";
            }
        }
        return "scrollRow scrollRowOn";
    }
1 голос
/ 23 августа 2010

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

Предполагая веб-формы на C # и ADO.Net, и предполагая, что вынужно точно этого HTML, вы можете циклически перебирать строки в DataSet и выводить HTML.

DataSet ds = {data set from your sql}
StringBuilder html = new StringBuilder();
foreach (DataRow row in DataSet.Tables[0].Rows) {
   html.Append( string.Format(@"<div class=""scrollRow"">
    <table width=""100%"">
        <tr>
            <td width=""25%"">Site name: <b>{0}</b></td>
            <td>Created on {1}</td>
            <td align="right"><button onclick="doRevert(1)">Revert to this</button></td>
        </tr>
    </table>",row["sitename"], row["createdate"]));
}

Вы можете включить HTML, имея <asp:Literal> в коде страницы иустановка свойства Text.

Вы также можете сделать это, создав узлы System.Web.UI.WebControls.Table в коде и добавив к ним TableRows и TableCells, используя тот же цикл, а затем добавив их встраница с помощью.Учитывая то, что вы дали нам до сих пор, вы, кажется, добавляете элементы управления на страницу с MasterPage, поэтому вам нужно будет добавить свои таблицы в ContentPlaceHolder мастера, который вы можете найти и добавить элементы управления так:

   ContentPlaceHolder ph = (ContentPlaceHolder)this.Master.FindControl( "ContentPlaceHolder1" );

   foreach (DataRow row in DataSet.Tables[0].Rows) {
      Panel pnl = new Panel();
      Table tbl = new Table();
      TableRow tblrow = new TableRow();
      TableCell cell1 = new TableCell();
      cell1.Text = string.Format("Site name: <b>{0}</b>",row["sitename"]);
      row.Cells.Add(cell1);
      tbl.Rows.Add(tblrow);
      pnl.Controls.Add(tbl);
      ph.Controls.Add(pnl);
   }

Вы можете установить свойства для TableRows и TableCells, но если вы сделаете это таким образом, вы потеряете некоторый контроль над генерируемым html, в частности, за атрибутами html ID.Вы, кажется, не используете их, так что, возможно, это нормально.

1 голос
/ 23 августа 2010

Я бы предложил управление повторителем. Вы можете использовать его примерно так:

<asp:Repeater runat="server" id="myRepeater">
<ItemTemplate>
<div class="scrollRow scrollRowOn">
    <table width="100%">
        <tr>
            <td width="25%">Site name: <b><% Eval("SiteName")%></b></td>
            <td>Created on <% Eval("CreatedOn")%></td>
            <td align="right"></td>
        </tr>
    </table>
</div>
</ItemTemplate>
</asp:Repeater>

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

myRepeater.DataSource = myData;
myRepeater.DataBind();

Где мои данные - это данные, которые вы извлекаете из базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...