ASP.net - 不确定如何生成表

时间:2010-08-23 12:44:20

标签: c# asp.net sql

给出以下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 个答案:

答案 0 :(得分:3)

尝试以下几点:

    <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>

在代码隐藏的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 :(得分:1)

我建议转发器控制。您可以使用以下内容:

<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();

我的数据是您从数据库中检索的数据。

答案 2 :(得分:1)

当然,有很多方法可以解决这个问题,但这里有一个(可能不是最好的,但无论如何都是主观的):

假设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"]));
}

您可以在页面代码中设置<asp:Literal>并设置Text属性来包含html。

您也可以通过在后面的代码中创建System.Web.UI.WebControls.Table节点并使用相同的循环将TableRows和TableCells添加到它们,然后使用这些节点添加到页面来实现。鉴于您到目前为止给我们的内容,您似乎是在使用MasterPage向页面添加控件,因此您需要将表格添加到Master的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属性。你似乎没有使用那些,所以也许没关系。