2008-12-23 9 views
0

J'ai un répéteur qui doit afficher une valeur de champ lié uniquement s'il existe. Ayant lu this post j'ai décidé de le faire en utilisant un littéral dans mon répéteur et en utilisant le déclencheur OnItemDatabound pour remplir mon littéral mais mon littéral ne semble pas être accessible depuis le code C# derrière et je ne comprends pas pourquoi!Numéro littéral nul

Heres la page ASPX

<asp:Repeater runat="server" ID="rpt_villaresults" OnItemDataBound="checkForChildren"> 
    <HeaderTemplate> 

    </HeaderTemplate> 
    <ItemTemplate>  
//.................MORE CODE HERE......................       
<div class="sleeps"><h4>To Sleep</h4><h5><%#Eval("sleeps")%> <asp:Literal ID="sleepsChildrenLit" runat="server" /> </h5></div> 
//.............MORE CODE HERE........................ 

Et le code derrière

public void checkForChildren(object sender, RepeaterItemEventArgs e) 
{ 
    Literal childLit = e.Item.FindControl("sleepsChildrenLit") as Literal; 
    //this is null at runtime 
    String str = e.Item.DataItem.ToString(); 
    if (e.Item.DataItem != null) 
    { 
     if (Regex.IsMatch(str, "[^0-9]")) 
     { 
      if (Convert.ToInt32(str) > 0) 
      { 
       childLit.Text = " + " + str; 
      } 
     }   
    } 
} 

Répondre

2

Comme vous le savez probablement quand vous dites: as Literal il peut revenir null valeurs. Si vous effectuez une distribution correcte, vous obtiendrez une exception lors de l'exécution qui vous donnera plus d'informations sur ce qui ne va pas et/ou quel élément vous pose le problème.

Si vous attendez toujours « chilLit » d'avoir une valeur et vous n'êtes pas la vérification des valeurs nulles, alors vous devriez jeter un littérales en utilisant

Literal childLit = (Literal)e.Item.FindControl("sleepsChildrenLit"); 
+0

grands esprits se;) Merci –

2

Eh bien, avec votre code actuel, nous ne savons pas si cela est car e.Item.FindControl renvoie null, ou parce que ce n'était pas un littéral. C'est pourquoi vous devriez utiliser un cast au lieu de "as" si vous êtes sûr du type qu'il devrait vraiment être.

Modifier le code:

Literal childLit = (Literal) e.Item.FindControl("sleepsChildrenLit"); 

et de voir ce qui se passe. Si vous obtenez une exception de distribution, vous saurez que c'est parce que c'était le mauvais type. Si vous obtenez toujours un NRE, FindControl renvoyait null.

EDIT: Maintenant, à part cela, nous allons jeter un oeil sur le code après:

String str = e.Item.DataItem.ToString(); 
if (e.Item.DataItem != null) 
{ 
    ... 
} 

Si e.item.DataItem est nul l'appel à ToString() va lancer une exception - de sorte que le chèque sur la ligne suivante est inutile. Je suppose que vous voulez effectivement:

if (e.Item.DataItem != null) 
{ 
    String str = e.Item.DataItem.ToString(); 
    ... 
} 
+0

Jon. J'ai utilisé la distribution et le childLit est toujours nul. Il est également étrange que intelisense ne prenne pas le littéral dans le code derrière. Je devrais juste être capable de faire référence à sleepsChildrenLit.Text .... mais je ne peux pas même si son fonctionnement au serveur. Je pensais que vous pourriez mettre un littéral n'importe où? – mancmanomyst

2

Le checkForChildren gestionnaire d'événements (OnItemDataBound) seront également appelés pour la HeaderItem du répéteur. Mais dans ce cas, e.Item.DataItem sera nul. Et bien sûr, FindControl() retournera également null, puisque vous n'avez pas de contrôle Literal avec un identifiant "sleepsChildrenLit" dans le HeaderTemplate.

Vous pouvez utiliser la propriété e.Item.ItemType pour vérifier si l'élément en cours est un HeaderItem d'un FooterItem ou un élément « normal », par exemple:

if (e.Item.ItemType == ListItemType.Header) 
{ 
... 
} 
else if (...) 
{ 
... 
}