sourcetip

빈 리피터 컨트롤의 기본 텍스트

fileupload 2023. 9. 15. 21:17
반응형

빈 리피터 컨트롤의 기본 텍스트

VS 2008을 사용하면 리피터 제어가 가능합니다.

<asp:Repeater runat="server" ID="storesRep" DataSourceID="storeSqlDataSource" 
    OnItemDataBound="StoresRep_ItemDataBound">
    <ItemTemplate>
        <table style="padding:0px">
        <tr>
            <td style="width:200px"><asp:Label ID="infoLbl" runat="server">
              Choose stores for upload:</asp:Label>&nbsp;&nbsp;&nbsp;&nbsp;
            </td>
            <td style="width:110px">
              <asp:Label ID="storeLbl" runat="server" Text='<%# Bind("Name") %>'>
              </asp:Label>&nbsp;&nbsp;
            </td>
            <td><asp:CheckBox runat="server" ID="storeCheck" /></td>
        </tr>
        </table>
    </ItemTemplate>
</asp:Repeater>
<asp:SqlDataSource ID="storeSqlDataSource" runat="server" 
    ConnectionString="<%$ ConnectionStrings:someConnectionString %>"
    SelectCommand="SELECT [StoreId], [Name] FROM [Store] Order By [Name]">
</asp:SqlDataSource>

이제 데이터 원본이 데이터베이스에서 항목을 반환하지 않는 경우 "No stores found"와 같은 기본 텍스트를 표시합니다.지금까지 주로 사용해 왔습니다.GridView내가 문제가 없었던 곳은EmptyDataText기여하다.

Joaos 답변은 단순화할 수도 있습니다.바닥글에서 기본 항목의 visible-property를 false로 설정하지 않고 다음 표현을 사용합니다.

<FooterTemplate>
    <asp:Label ID="defaultItem" runat="server" 
        Visible='<%# YourRepeater.Items.Count == 0 %>' Text="No items found" />
</FooterTemplate>

이렇게 하면 코드를 저장할 수 있습니다.

또 다른 가능성:

<FooterTemplate>
    <asp:Label ID="lblEmptyData" runat="server" Visible='<%# ((Repeater)Container.NamingContainer).Items.Count == 0 %>' Text="No items found" />
</FooterTemplate>

이 코드 조각의 장점은 중계기에 할당한 ID에 의존하지 않는다는 것입니다.

당신은 그 사실을 해결할 수 있을 것입니다.Repeater를 사용하여 수행 중인 작업을 수행하는 내장된 방식을 지원하지 않습니다.FooterTemplate와 함께OnItemDataBound이벤트 및 바닥글 표시는 데이터 소스가 항목을 반환하지 않을 때만 가능합니다.

이 작업을 수행하는 방법에 대한 예제는 다음 사이트에서 확인할 수 있습니다.

ASP에서 빈 데이터 처리.NET 중계기 제어

ASP에서 Empty Template를 표시하는 방법NET 리피터 컨트롤?

이 하위 클래스는 EmptyDataTemplate 속성을 추가합니다.마크업에서 요소를 입력할 때와 마찬가지로 요소를 입력합니다.기본적으로 데이터가 없는 경우 머리말과 바닥글이 숨겨집니다. HeaderVisible로 변경할 수 있습니다.빈 공간과 바닥글이 보일 때마크업에서 속성이 비어 있을 때.

public class RepeaterWithEmptyDataTemplate : Repeater
{
    public virtual ITemplate EmptyDataTemplate { get; set; }

    protected virtual bool DefaultHeaderVisibleWhenEmpty
    {
        get { return false; }
    }

    protected virtual bool DefaultFooterVisibleWhenEmpty
    {
        get { return false; }
    }

    public bool HeaderVisibleWhenEmpty
    {
        get { return ViewState["hve"] == null ? DefaultHeaderVisibleWhenEmpty : (bool) ViewState["hve"]; }
        set { ViewState["hve"] = value; }
    }

    public bool FooterVisibleWhenEmpty
    {
        get { return ViewState["fve"] == null ? DefaultFooterVisibleWhenEmpty : (bool) ViewState["fve"]; }
        set { ViewState["fve"] = value; }
    }

    protected override void OnDataBinding(EventArgs e)
    {
        base.OnDataBinding(e);
        if (Items.Count == 0 && EmptyDataTemplate != null)
        {
            var emptyPlaceHolder = new PlaceHolder {ID = "empty", Visible = true};
            EmptyDataTemplate.InstantiateIn(emptyPlaceHolder);

            //figure out where to put placeholder
            RepeaterItem footer =
                Controls.OfType<RepeaterItem>().FirstOrDefault(i => i.ItemType == ListItemType.Footer);
            if (footer == null)
            {
                //add to end if no footer
                Controls.Add(emptyPlaceHolder);
            }
            else
            {
                Controls.AddAt(Controls.IndexOf(footer), emptyPlaceHolder);
            }

            //hide header and footer according to properties.
            foreach (RepeaterItem x in Controls.OfType<RepeaterItem>())
            {
                switch (x.ItemType)
                {
                    case ListItemType.Header:
                        x.Visible = HeaderVisibleWhenEmpty;
                        break;
                    case ListItemType.Footer:
                        x.Visible = FooterVisibleWhenEmpty;
                        break;
                }
            }
        }
    }
}

마크업의 샘플:

<myprefix:RepeaterWithEmptyDataTemplate runat=server>
    <ItemTemplate>blah blah blah</ItemTemplate>
    <EmptyDataTemplate>Hey, no data!</EmptyDataTemplate>
</myprefix:RepeaterWithEmptyDataTemplate>  

DataBind 메서드를 호출하지 않으면 빈 데이터 템플릿이 표시되지 않습니다.

발밑 템플릿을 사용하여 마사지를 관리할 수 있습니다.

1단계

<FooterTemplate>
    <%-- Label used for showing Error Message --%>
    <asp:Label ID="lblDefaultMessage" runat="server" Text="Sorry, no item is there to show." Visible="false">
    </asp:Label>
</FooterTemplate> 

2단계

리피터에서 lable의 핸들 가시성_항목DataBound 이벤트 다음과 같습니다.

protected void Repeater_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
 if (Repeater.Items.Count < 1)
  {
    if (e.Item.ItemType == ListItemType.Footer)
    {
        Label lblDefaultMessage= (Label)e.Item.FindControl("lblDefaultMessage");
        lblDefaultMessage.Visible = true;
    }
  }
}

이전 답변에서 제공된 가시적 속성과 aspliteral을 사용하여 erionpc의 답변을 '데이터 없음' 또는 레코드 수를 표시하도록 확장했습니다.

<FooterTemplate>
                <asp:Literal ID="repeaterEmptyDataRow" runat="server" Visible='<%# Results_Repeater.Items.Count == 0 %>'>
                    <tr>
                        <td>No Data Found</td>    
                    </tr>
                </asp:Literal>
                <asp:Literal ID="repeaterResultsDataRow1" runat="server" Visible='<%# Results_Repeater.Items.Count != 0 %>'>
                    <tr>
                        <td>
                </asp:Literal>
                <asp:Literal ID="repeaterResultsDataRow2" runat="server" Visible='<%# Results_Repeater.Items.Count != 0 %>' Text='<%# String.Concat(Results_Repeater.Items.Count.ToString(), " records.") %>' />
                <asp:Literal ID="repeaterResultsDataRow3" runat="server" Visible='<%# Results_Repeater.Items.Count != 0 %>'>
                        </td>
                    </tr>
                </asp:Literal>
                </table>
            </FooterTemplate>

저는 asp를 많이 쓰지 않기 때문에 좀 더 깔끔한 방법이 있을 수 있습니다.

이 문제를 해결하는 가장 좋은 방법은 다음과 같습니다.

  1. 페이지의 아무 곳에나 다음 레이블을 추가합니다.

    <asp:Label ID="lblEmptyRepeater" runat="server" Visible="false" Text="There are no items in this repeater"></asp:Label>
    
  2. 중계기에 대한 OnPreRender 이벤트 추가

    <asp:Repeater ID="emptyRepeater" runat="server" OnPreRender="emptyRepeater_PreRender">
    
  3. 이제 이 사건 안에 당신의 코드 뒤에 있는 코드를 써보세요.

    protected void emptyRepeater_PreRender(object sender, EventArgs e)
    {
       lblEmptyRepeater.Visible = (emptyRepeater.Items.Count==0);
    }
    
  4. 이제 빈 중계기는 데이터가 바인딩된 후 페이지에 렌더링되기 전에 확인해야 하며, 빈 경우 라벨을 표시해야 합니다.

n. 3번 답변을 토대로 다음과 같은 해결책을 채택했습니다. 제가 보기에 충분히 좋은 것 같습니다.

<asp:Literal ID="emptyDataRowCnt" runat="server" Visible='<%# MyRepeater.Items.Count == 0 %>'>
    <li class="row emptyDataRow">No data here</li>
</asp:Literal>

언급URL : https://stackoverflow.com/questions/5271500/default-text-for-empty-repeater-control

반응형