Нулевой буквальный вопрос - PullRequest
0 голосов
/ 23 декабря 2008

У меня есть повторитель, который должен показывать значение связанного поля, только если оно существует. Прочитав этот пост , я решил сделать это, используя литерал в моем репитере и используя триггер OnItemDatabound для заполнения моего литерала, но мой литерал, кажется, не доступен из кода c #, и я не понимаю, почему!

Вот страница 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........................

И код позади

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

Ответы [ 3 ]

2 голосов
/ 23 декабря 2008

Ну, с вашим текущим кодом мы не знаем, является ли это тем, что e.Item.FindControl возвращает ноль, или потому что это не Literal. Вот почему вы должны использовать приведение вместо «как», если вы уверены, что тип действительно должен быть.

Измените код на:

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

и посмотри, что получится. Если вы получите исключение приведения, вы узнаете, что это был неправильный тип. Если вы все еще получаете NRE, FindControl возвращал значение NULL.

РЕДАКТИРОВАТЬ: Теперь, кроме этого, давайте посмотрим на код после него:

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

Если e.item.DataItem равно нулю, то вызов ToString () вызовет исключение - поэтому проверка на следующей строке бессмысленна. Я подозреваю, что вы на самом деле хотите:

if (e.Item.DataItem != null)
{
    String str = e.Item.DataItem.ToString();
    ...
}
2 голосов
/ 23 декабря 2008

Обработчик события OnItemDataBound checkForChildren () также будет вызываться для HeaderItem ретранслятора. Но в этом случае e.Item.DataItem будет нулевым. И, конечно, FindControl () также вернет значение null, поскольку у вас нет элемента управления Literal с идентификатором «sleepsChildrenLit» в шаблоне Header.

Вы можете использовать свойство e.Item.ItemType, чтобы проверить, является ли текущий элемент HeaderItem элемента FooterItem или «нормальным» элементом, например:

if (e.Item.ItemType == ListItemType.Header)
{
...
}
else if (...)
{
...
}
2 голосов
/ 23 декабря 2008

Как вы, вероятно, знаете, когда говорите: as Literal он может возвращать null значения. Если вы сделаете правильное приведение, вы получите исключение во время выполнения, которое даст вам больше информации о том, что не так и / или какой элемент вызывает у вас проблему.

Если вы всегда ожидаете, что «chilLit» будет иметь значение, и вы не будете проверять наличие нулей, то вам следует привести его к Literal, используя

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