【问题标题】:Object reference not set to an instance of an object #2对象引用未设置为对象 #2 的实例
【发布时间】:2012-11-14 05:48:31
【问题描述】:

我收到以下错误消息:

对象引用未设置为对象的实例。

代码隐藏:

public partial class Edit : System.Web.UI.Page
{
    private TextBox updated_time;

    protected void Page_Load(object sender, EventArgs e)
    {
        updated_time = (TextBox)ABC_DV.FindControl("txt_updated_time");
        updated_time.Text = DateTime.Now.ToString();
    }
}

我该如何解决这个问题?

更新

<asp:DetailsView ID="ABC_DV" runat="server" AutoGenerateRows="False"
        DefaultMode="Edit" DataKeyNames="TYPE_ID" DataSourceID="ABC_EDS">
        <Fields>
            <asp:TemplateField HeaderText="Type Id" SortExpression="TYPE_ID">
                <EditItemTemplate>
                    <asp:TextBox ID="txt_type_id" Width="200" runat="server" Text='<%# Bind("TYPE_ID") %>'></asp:TextBox>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("TYPE_ID") %>'></asp:TextBox>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Label1" runat="server" Text='<%# Bind("TYPE_ID") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>        
            <asp:TemplateField HeaderText="Updated Time" SortExpression="UDPATED_TIME">
                <EditItemTemplate>
                    <asp:TextBox ID="txt_updated_time" Width="200" runat="server" Text='<%# Bind("UDPATED_TIME") %>'></asp:TextBox>
                </EditItemTemplate>
                <InsertItemTemplate>
                    <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("UDPATED_TIME") %>'></asp:TextBox>
                </InsertItemTemplate>
                <ItemTemplate>
                    <asp:Label ID="Labe2" runat="server" Text='<%# Bind("UDPATED_TIME") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>            
        </Fields>
    </asp:DetailsView>

【问题讨论】:

  • 确保 ABC_DV 已正确实例化,并且 txt_updated_time 存在于 ABC_DV 中,因此 FindControl 调用不会返回 null。
  • 在什么级别?发布您的标记或相关的建筑代码,FindControl 不是递归的。
  • 似乎(TextBox)ABC_DV.FindControl("txt_updated_time"); 正在返回null,这意味着ABC_DV.FindControl() 找不到txt_updated_time。可以上传ABC_DV的aspx代码吗?
  • @Bishan 好的,您需要考虑DetailsView 在尝试访问控件时所处的模式,如果不是,它不会存在于层次结构中' t 在编辑模式下导致 Page_Load 在没有 DetailsView 在编辑模式下调用时爆炸。在代码中添加一些检查以正确处理控件状态。
  • 几乎所有的 NullReferenceException 情况都是一样的。请参阅“What is a NullReferenceException in .NET?”获取一些提示。

标签: c# asp.net .net exception-handling findcontrol


【解决方案1】:

好的,您需要考虑DetailsView 在尝试访问控件时所处的模式,如果它不在编辑模式下,它将不会存在于层次结构中,从而导致Page_Load 在它发生时爆炸在编辑模式下调用没有DetailsView。为您的代码添加一些检查以正确处理控件状态。

protected void Page_Load(object sender, EventArgs e)
{
    if (ABC_DV.CurrentMode == DetailsViewMode.Edit) {
      updated_time = (TextBox)ABC_DV.FindControl("txt_updated_time");
      if(null != updated_time)
        updated_time.Text = DateTime.Now.ToString();
    }
}

【讨论】:

    【解决方案2】:
    TextBox updated_time = ABC_DV.FindControl("txt_updated_time") as TextBox;
    if (updated_time  != null)
    {
        updated_time.Text = DateTime.Now.ToString();
    }
    

    【讨论】:

      【解决方案3】:

      当您点击Page_Load 方法时,您的控件应该已经重建并重新添加到页面中。您此时收到错误的事实表明特定控件不存在 - 至少不存在您指定的 ID。

      尝试将代码移动到您的PreRender() - 这是在页面呈现到响应流之前执行的方法,如果您添加了动态控件或弄乱了控件的 ID,那么这应该很好在这个阶段之前。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-20
        相关资源
        最近更新 更多