Объект не установлен в экземпляр объекта

#c# #asp.net #.net #gridview #exception-handling

#c# #asp.net #.net #просмотр сетки #исключение

Вопрос:

Я ломал голову над этим уже около дня, и мне нужна помощь. У меня есть GridView, и я хотел бы изменить обратный цвет строки на основе поля базы данных. Поле базы данных «неактивно».

Вот разметка:

 <asp:GridView ID="GridView1" runat="server" DataSourceID="WishListDS"  AutoGenerateColumns="false" CssClass="WishListGridView" GridLines="None" OnRowDataBound="WishListGV_RowDataBound">
    <Columns>       
        <asp:TemplateField>
            <ItemTemplate>
                <div class="wlMessage">
                    <asp:Hyperlink ID="ViewHL" runat="server" Text="View" NavigateUrl='<%# "WishListSearchResults.aspx?id="   Eval("sysid")%>' />
                    <asp:Hyperlink ID="EditHL" runat="server" Text="Edit" NavigateUrl='<%# "WishListEdit.aspx?id="   Eval("sysid")%>' />
                </div>
                <asp:Hyperlink ID="NameLBL" Runat="server" Text='<%# Eval("customName")%>' NavigateUrl='<%# "WishListSearchResults.aspx?id="   Eval("sysid")%>' CssClass="wlGVContentTitle" />
                <asp:Label ID="ArrivalLBL" Runat="server" Text='<%# Eval("earliestArrival","{0:d}")   " - "   Eval("latestArrival","{0:d}")%>' CssClass="wlGVContent" />
                <asp:Label ID="StateLBL" Runat="server" Text='<%# Eval("City")   ", "   Eval("State")%>' CssClass="wlGVContent"></asp:Label>
                <asp:HiddenField ID="InactiveHF" runat="server" value='<%# Eval("InActive") %>' />
                <hr />               
            </ItemTemplate>
        </asp:TemplateField>             
    </Columns>
</asp:GridView>
  

Вот код:

 protected void WishListGV_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
       HiddenField hf = (HiddenField)e.Row.FindControl("InActiveHF");
       if (hf.Value == "True")
       {
       }
    }
}
  

Я получаю сообщение об ошибке:

Ссылка на объект не установлена для экземпляра объекта «.

строка

 if (hf.Value == "True")
  

У кого-нибудь есть идеи о том, почему это происходит?

Ответ №1:

Существует несоответствие между идентификатором HiddenField в разметке и в коде. Используйте это:

 HiddenField hf = (HiddenField)e.Row.FindControl("InactiveHF");
  

Ответ №2:

В обычном случае, чтобы предотвратить исключение NullReferenceException, проверьте значение null:

 HiddenField hf = (HiddenField)e.Row.FindControl("id");
if (hf != null amp;amp; hf.Value == Boolean.TrueString)
{
}
else
{
    // handle on your own, e.g.:
    throw new InvalidOperationException("Control not found");
}
  

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

1. .. и этот метод также может очень легко скрывать ошибки, поэтому, хотя он может «работать» [не создавая исключения], он также может работать не так, как хотелось бы .. используйте только тогда, когда ожидается , что FindControl может возвращать значение null (что по моему опыту встречается редко ). В этом случае это решение / подход [вероятно] предотвращает сообщение о допустимой ошибке программирования .