ASP.NET에서 HTML 테이블을 가장 잘 채우려면 어떻게 해야 합니까?

StackOverflow https://stackoverflow.com/questions/43803

  •  09-06-2019
  •  | 
  •  

문제

이것이 내가 가진 것입니다.효과가있다.하지만 더 간단하고 더 좋은 방법이 있을까요?

ASPX 페이지…

<asp:Repeater ID="RepeaterBooks" runat="server">
    <HeaderTemplate>
        <table class="report">
            <tr>
                <th>Published</th>
                <th>Title</th>
                <th>Author</th>
                <th>Price</th>
            </tr>
    </HeaderTemplate>
    <ItemTemplate>
            <tr>
                <td><asp:Literal ID="LiteralPublished" runat="server" /></td>
                <td><asp:Literal ID="LiteralTitle" runat="server" /></td>
                <td><asp:Literal ID="LiteralAuthor" runat="server" /></td>
                <td><asp:Literal ID="LiteralPrice" runat="server" /></td>
            </tr>
    </ItemTemplate>
    <FooterTemplate>
        </table>
    </FooterTemplate>
</asp:Repeater>

ASPX.VB 코드 뒤에…

Protected Sub Page_Load( ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim db As New BookstoreDataContext
    RepeaterBooks.DataSource = From b In db.Books _
                               Order By b.Published _
                               Select b
    RepeaterBooks.DataBind()
End Sub

Sub RepeaterBooks_ItemDataBound( ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles RepeaterBooks.ItemDataBound
    If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
        Dim b As Book = DirectCast(e.Item.DataItem, Book)
        DirectCast(e.Item.FindControl("LiteralPublished"), Literal).Text = "<nobr>" + b.Published.ToShortDateString + "</nobr>"
        DirectCast(e.Item.FindControl("LiteralTitle"), Literal).Text = "<nobr>" + TryNbsp(HttpContext.Current.Server.HtmlEncode(b.Title)) + "</nobr>"
        DirectCast(e.Item.FindControl("LiteralAuthor"), Literal).Text = "<nobr>" + TryNbsp(HttpContext.Current.Server.HtmlEncode(b.Author)) + "</nobr>"
        DirectCast(e.Item.FindControl("LiteralPrice"), Literal).Text = "<nobr>" + Format(b.Price, "c") + "</nobr>"
    End If
End Sub

Function TryNbsp(ByVal s As String) As String
    If s = "" Then
        Return "&nbsp;"
    Else
        Return s
    End If
End Function
도움이 되었습니까?

해결책

@제프

이런 종류의 Eval 문은 실제로 2.0에서 추가되었지만 성능이 중요하다면 Eval은 Reflection을 사용하므로 피해야 합니다.

반복기는 이를 수행하는 매우 좋은 방법이지만 코드에서 테이블을 생성하는 것이 더 빠를 수도 있습니다.

ASPX 페이지:

<table class="report" id="bookTable" runat="server">
        <tr>
            <th>Published</th>
            <th>Title</th>
            <th>Author</th>
            <th>Price</th>
        </tr>
 </table>

코드 비하인드:

Protected Sub Page_Load( ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not Page.IsPostback Then
        BuildTable()
    End If
End Sub

Private Sub BuildTable()
    Dim db As New BookstoreDataContext
    Dim bookCollection = from b in db.Books _
                         Order By b.Published _
                         Select b
    Dim row As HtmlTableRow
    Dim cell As HtmlTableCell

    For Each book As Books In bookCollection
        row = New HtmlTableRow()
        cell = New HtmlTableCell With { .InnerText = b.Published.ToShortDateString }
        row.Controls.Add(cell)
        cell = New HtmlTableCell With { .InnerText = TryNbsp(HttpContext.Current.Server.HtmlEncode(b.Title)) }
        row.Controls.Add(cell)
        cell = New HtmlTableCell With { .InnerText = TryNbsp(HttpContext.Current.Server.HtmlEncode(b.Author))
        row.Controls.Add(cell)
        cell = New HtmlTableCell With { .InnerText = Format(b.Price, "c") }
        row.Controls.Add(cell)
        bookTable.Controls.Add(row)
    Next

속도가 얼마나 중요한지에 달려 있다고 생각합니다.단순함을 위해 나는 리피터를 사용할 것이라고 생각합니다.

다른 팁

그만큼 목록보기 프레임워크 3.5에 도입된 제어가 조금 더 나은 솔루션일 수 있습니다.마크업은 다음과 같습니다.

<asp:ListView runat="server" ID="ListView1" 
    DataSourceID="SqlDataSource1">
  <LayoutTemplate>
    <table runat="server" id="table1" runat="server" >
      <tr runat="server" id="itemPlaceholder" ></tr>
    </table>
  </LayoutTemplate>
  <ItemTemplate>
    <tr runat="server>
      <td runat="server">
        <asp:Label ID="NameLabel" runat="server" 
          Text='<%#Eval("Name") %>' />
      </td>
    </tr>
  </ItemTemplate>
</asp:ListView>

.Net 3.0+에서는 다음과 같이 ItemDataBound를 asp:Literal로 바꿀 수 있습니다.

<ItemTemplate>
            <tr>
                <td><%# Eval("published") %></td>
                ...

여기서 "게시됨"은 반복기에 바인딩된 데이터의 필드 이름입니다.

편집하다:@알라섹:반영의 성능 저하가 종종 지나치게 강조되는 것 같습니다.분명히 앱의 성능을 벤치마킹해야 하지만 Eval의 히트는 밀리초 단위로 측정될 가능성이 높습니다.앱이 많은 동시 히트를 제공하지 않는 한 이것은 아마도 문제가 되지 않을 것이며 Eval을 사용하는 코드의 단순성과 프레젠테이션의 적절한 분리가 좋은 솔루션이 될 것입니다.

이것이 GridView의 목적입니다.

<asp:GridView runat="server" DataSourceID="SqlDataSource1">
   <Columns>
      <asp:BoundField HeaderText="Published" DataField="Published" />
      <asp:BoundField HeaderText="Author" DataField="Author" />
   </Columns>
</asp:GridView>

저는 GridView(또는 이전 버전의 ASP.NET을 사용하는 경우 DataGrid)를 사용하겠습니다.

<asp:GridView ID="gvBooks" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:BoundField HeaderText="Published" DataField="Published" />
        <asp:BoundField HeaderText="Title" DataField="Title" />                     
        <asp:BoundField HeaderText="Author" DataField="Author" />
        <asp:BoundField HeaderText="Price" DataField="Price" />
    </Columns>
</asp:GridView>

일부 코드 숨김을 사용하면 다음과 같습니다.

Private Sub gvBooksRowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles gvBooks.RowDataBound
     Select Case e.Row.RowType
        Case DataControlRowType.DataRow

            ''' Your code here '''

     End Select
End Sub

비슷한 방법으로 묶으시면 됩니다.RowDataBound 이벤트가 필요합니다.

나는 Geoff의 말에 동의한다. 우리가 사용하는 유일한 시간은 Literals 우리가 뭔가를 하고 싶다면 다른 데이터와 함께.
예를 들어, 우리는 DueDate 필드에 실제 날짜 대신 "오늘" 또는 "어제"를 표시합니다.

A라섹 썼다:

…코드로 테이블 생성…

나는 그 모습을 좋아한다!오타나 필드 이름 변경으로 인해 런타임 예외가 발생할 가능성이 훨씬 적은 것 같습니다.

ASP.NET에서 처리하는 편집 기능이 필요하지 않다면 떨어져있어 DataGrid 및 GridView에서 ...그들은 제공한다 불필요한 팽창.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top