2008-12-15 21 views
8

Veri sayfalarını asp.net sayfasında tekrarlayıcı kontrolüne basan bir kod var. Ancak, döndürülen değerlerin bazıları boş/boştur - ve bu durum boş alanlar olduğunda sonucun çirkin görünmesini sağlar.ASP.net sayfasında Koşullu Mantık sayfası

Asp.net denetimlerinde koşullu mantığı nasıl yaparsınız, yani varsa bir değer yazdırın, sadece bir sonraki değere geçin.

Ayrıca eklemeliyim - işaretlemenin koşullu olmasını istiyorum, sanki
etiketini de istemiyorum.

Veritabanımdan geri aldığım değerlerin türünü göstermek için aşağıdaki kod parçacığı aşağıdadır. (Adres 2'un hiç bir değere sahip olmaması yaygındır).

<div id="results"> 
    <asp:Repeater ID="repeaterResults" runat="server"> 
     <ItemTemplate> 
      Company:  <strong><%#Eval("CompanyName") %></strong><br /> 
      Contact Name: <strong><%#Eval("ContactName") %></strong><br /> 
      Address:  <strong><%#Eval("Address1")%></strong><br />      
          <strong><%#Eval("Address2")%></strong><br />.................. 

çok teşekkürler

cevap

6

tamamen size gerçekten boş/boş değerleri ve dokunmak bile nerede ve nasıl bağlıdır bu şekilde oldukça sübjektif bir olacak hangi sizinle ilgilenen kişiler iki kişiden biri .

Örneğin, bazıları veritabanı düzeyindeki boş değerleri işlemeyi sever; bazıları iş mantığı katmanındaki varsayılan değerleri kodlamayı ve diğerleri arasında UI'deki varsayılan/boş değerleri işlemeyi sever - örneğin, aradaki seçeneklerin çokluğundan bahsetmez .

Her iki şekilde de kişisel tercihim, karışıklığı önlemek için UI düzeyinde o alan için hiçbir verinin mevcut olmadığını gösterdiğinizden emin olmanızdır. çizgisinde en kötü şey At:

<strong><% If (Eval("Address2").Length > 0) Then %><%#Eval("Address2")%><% Else %>No data available for Address 2<% End If %></strong><br /> 

Bu şekilde en azından kullanıcı veri yok doğrusu bazı sistem/idari hatasının olup olmadığını bilmeden daha kullanılabilir olduğunu bilir.

Umut yardımcı olur :)

1

Sen IsDBNull kullanabilirsiniz (obj)

If IsDbNull(<%#Eval("Address2")%>) then 
    etc 
End If 
+0

Bu C# geçerli: IsDBNull() Microsoft.VisualBasic ad –

+0

üzerinden ulaşılabilir olsa bu kadar == DBNull.Value kullanın –

3

Tekrarlayıcının madde olduğunda genellikle OnItemDataBound meydana gelen olay Tekrarlayıcının olayı kullanıyorum, bunu yolu vardır olabilir vardır bir veri öğesine bağlı.

OnItemDataBound olayını açıklamak için, her zaman görüntülenen bir alan (Yineleme) ve null değilse görüntülenecek isteğe bağlı alan ile tekrarlayıcı olduğunu varsayalım (İsteğe bağlı). Daha fazla seçenek, isteğe bağlı alanın boş veya boş olması durumunda önceden tanımlanmış bazı değerleri göstermek isteriz.
Bunu yapmak için, önce tekrarlayıcıya ait OnItemDataBound olayını bir yönteme işaret etmemiz gerekir. Ayrıca, tekrarlayıcı öğesinin şablonunu da oluşturmamız gerekir. Tekrarlayıcı'nın öğe şablonunda herhangi bir sunucu kontrolünü daha sonra OnItemDataBound yönteminde başvurabileceğimiz bir şekilde kullanabiliriz.Ayrıca

<asp:Repeater ID="repeaterResults" runat="server" OnItemDataBound="repeaterResult_ItemDataDataBound"> 
    <ItemTemplate> 
    <strong><%#Eval("Name") %></strong> 
    <asp:Literal runat="server" ID="ltlOption" /> 
    <br /> 
    </ItemTemplate></asp:Repeater> 

en biz basit iki özelliklere sahip olan nesneler topluluğu bağlayacaktır varsayalım: aşağıdaki gibi Adı ve Seçenek şu şekildedir:

public class SimpleEntity 
{ 
    public string Name {get;set;} 
    public string Option {get;set;} 
} 

Sonra repeaterResult_ItemDataDataBound yöntemini uygulayacak:

protected void repeaterResult_ItemDataDataBound(object sender, RepeaterItemEventArgs e) 
{ 
    SimpleEntity ent = e.Item.DataItem as SimpleEntity; 
    Literal ltlOption = e.Item.FindControl("ltlOption") as Literal; 
    if (ent != null && ltlOption != null) 
    { 
    if (!string.IsNullOrEmpty(ent.Option)) 
    { 
     ltlOption.Text = ent.Option; 
    } 
    else 
    { 
     ltlOption.Text = "Not entered!"; 
    } 

    } 
} 

Yukarıdaki yöntem uygulandığından, isteğe bağlı alan boşsa veya boş bir dizeyse, önceden tanımlanmış alanı gösteririz. d dizesi "Girilmedi!"

8

Her anahtar/değer çiftinin 2 özellikli özel denetime sarılmasını öneriyorum.

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ShowPair.ascx.cs" Inherits="MyWA.ShowPair" %> 

<% if (!string.IsNullOrEmpty(Value)) 
    { %> 
<%=Key %> : <%=Value %> 
<% } %> 

Ve sonra tekrarlayıcı şablonuna denetimleri koymak: Bu kontrol değeri boş değil sadece kendini gösterecektir Bu çok eski bir soru olduğunu fark

<asp:Repeater runat='server' ID="repeater1"> 
    <ItemTemplate> 
     <cst:ShowPair Key="Company Name:" Value="<%#((Company)Container.DataItem).CompanyName %>" runat="server"/> 
     <cst:ShowPair Key="Contact Name:" Value="<%#((Company)Container.DataItem).ContactName %>" runat="server" /> 
     <cst:ShowPair Key="Address 1:" Value="<%#((Company)Container.DataItem).Address1 %>" runat="server" /> 
    </ItemTemplate> 
    </asp:Repeater> 
0

ama İsterdim Bu sorunun üstesinden gelmenin belki de en iyi yolunun veritabanı düzeyinde olduğunu ve evet - OP'nin herhangi bir veri kaynağı türü belirtmediğini biliyorum.

Kullanılmakta olan dilin en az Transact SQL olduğunu varsayıyorum (evet, seninle benim gibi). Bu amaçla, bileşik alanları üretmek için veri kaynağını kullanma eğilimindeyim. ISNULL numaralı bir adreste, hangi alanların kullanıldığını görmek ve NULL alanıyla karşılaşılırsa varsayılan değeri döndürmek mutlu olacaktır. Bunun üzerine, hedef çıkış ortamındaki satır sonlarına izin vermek için bir ayırıcı karakter (ler) eklenebilir. Bir seçenek, virgül + bir boşluk sınırlayıcı ', ' olarak kullanmaktır.

SELECT 
    ISNULL(src.address1 + ', ', '') + 
    ISNULL(src.address2 + ', ', '') + 
    ISNULL(src.address3 + ', ', '') + 
    ISNULL(src.address4 + ', ', '') + 
    ISNULL(src.postalcode, '') AS CompoundAddress 
... 

Bu

kendine karşı NULL kullanarak çalışır - NULL ekleyerek, bu nedenle değer bizim virgül boşluk + içerecektir ya döndü NULL döndürür veya boş bir dize döndürür.

ve işareti boş bir dizeye NULL dönüştürecektir Bu durumda benzer adres alanını üreten içine Microsoft Access 'hile' için yapılabilecek bir şey ...

SELECT 
    (src.address1 + ', ') & 
    (src.address2 + ', ') & 
    (src.address3 + ', ') & 
    (src.address4 + ', ') & 
    (src.postalcode) As CompoundAddress 
... 

ama aynı hala geçerlidir Dizenin potansiyel olarak NULL alanına eklenmesi. Yani şimdi

, biz düzgün çıkış adresimizi HTML yapabilirsiniz ...

<div id="results"> 
    <asp:Repeater ID="repeaterResults" runat="server"> 
     <ItemTemplate> 
      Company:  <strong><%#Eval("CompanyName") %></strong><br /> 
      Contact Name: <strong><%#Eval("ContactName") %></strong><br /> 
      Address:  <strong><%#Eval("CompoundAddress").ToString().Replace(", ", "<br />") %></strong><br /> 
İlgili konular