#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. помогите мне, Тим Шмелтер. Я поражен. Я этого не понял.