отключить метку повторителя при некотором условии в asp .net

#c# #asp.net

#c# #asp.net

Вопрос:

Разметка

 <HeaderTemplate>
    <table>
        <tr>
            <th>
                <asp:Label ID="label12" runat="server" Text="Editor"></asp:Label>
            </th>
        </tr>
</HeaderTemplate>
  

Код, лежащий в основе

 protected void ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        Label label12 = (Label)e.Item.FindControl("label12");
        Label activeLabel = (Label)e.Item.FindControl("lblEditor");
        string s = activeLabel.Text;
        if (s != "Sao Palo")
        {
            activeLabel.Visible = true;
            label12.Visible = true;
        }
        else
        {                    
            activeLabel.Visible = false;
            label12.Visible = false;   
        }
    }
}
  

Я получаю NullReferenceException :

 label12.visible=true;
  

Комментарии:

1. Можете ли вы также показать вам ASP.NET код?

2. где именно вы получили нулевую ссылку?

3. Разве это приведение к типу не должно завершиться ошибкой, если оно было в строке label12.visible = true?

4. @Mino: Нет. (Label)null все в порядке.

5. это повторитель, и когда я запускаю код, он выдает исключение с нулевой ссылкой на label12.visible=true;

Ответ №1:

Эта метка находится в заголовке, поэтому ее нельзя найти в repeater-items. Поэтому измените e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) на e.Item.ItemType == ListItemType.Header .

 protected void ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Header)
    {
        Label label12 = (Label)e.Item.FindControl("label12");
        // ...
    }
}
  

Но поскольку другая метка находится не в адере, а в элементе, вам нужен другой подход. Вы также можете получить заголовок-метку через Repeater.Controls[0].Controls[0].FindControl("label12"); .

Так что это должно сработать:

 protected void ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        Label label12 = (Label)((Repeater)sender).Controls[0].Controls[0].FindControl("label12");;
        Label activeLabel = (Label)e.Item.FindControl("lblEditor");
        string s = activeLabel.Text;
        if (s != "Sao Palo")
        {
            activeLabel.Visible = true;
            label12.Visible = true;
        }
        else
        {                    
            activeLabel.Visible = false;
            label12.Visible = false;   
        }
    }
}
  

Комментарии:

1. Вероятно, это все равно завершится неудачей, поскольку activeLabel не определено в HeaderTemplate

2. если я изменюсь таким образом, это приведет к тому же исключению в строке s = activeLabel. Текст;

3. но он не может неявно преобразовать тип ‘System.Web.UI.Control’ в ‘System.Web.UI.WebControls. Метка’.

4. @user3789358: я забыл привести его к Label , исправлено.

5. помогите мне, Тим Шмелтер. Я поражен. Я этого не понял.