对象引用未设置为对象#2的实例

时间:2012-11-14 05:48:31

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

我收到以下错误消息:

  

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

代码隐藏:

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>

3 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:0)

TextBox updated_time = ABC_DV.FindControl("txt_updated_time") as TextBox;
if (updated_time  != null)
{
    updated_time.Text = DateTime.Now.ToString();
}

答案 2 :(得分:0)

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

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