TextBox插入不起作用

时间:2016-11-22 20:09:32

标签: c# asp.net

我在这里完全失败了!也许有人会看到我遗失的东西。我在其他地方使用相同的代码,它工作得很好。目的是使用我想为用户提供的数据为编辑模式FromView设定种子。在这种情况下,我不允许用户更改我提供的信息。

当我尝试运行时,我得到的是:

  

对象引用未设置为对象的实例。     描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

     

异常详细信息:System.NullReferenceException:对象引用   没有设置为对象的实例。

我的代码后面检查空引用,所以我不知道我能做些什么来纠正这个。这在我的代码中的其他地方工作(当然变量不同)。

这是aspx页面中的一个片段,然后是它背后的C#代码。

<asp:Panel runat="server" ID="RejectDetailPnl" Visible="false">
<asp:Button ID="RejectBtn" runat="server" OnClick="RejectBtn_Click" BackColor="#ff0000" ForeColor="#ffffff" Text="Click To Reject" />
<asp:FormView ID="RejSubmittFV" runat="server" OnInit="RejSubmittFV_Init" DefaultMode="Edit" DataSourceID="RejSubmitDS">
    <EditItemTemplate>
        CAssetID:
        <asp:TextBox Text='<%# Bind("CAssetID") %>' runat="server" BackColor="LightGray" ReadOnly="true" ID="CAssetIDTextBox" /><br />
        Reason:
        <asp:TextBox Text='<%# Bind("Reason") %>' runat="server" ID="ReasonTextBox" Width="500" Height="500" TextMode="MultiLine" OnTextChanged="ReasonTextBox_TextChanged" /><br />
        Source:
        <asp:TextBox Text='<%# Bind("Source") %>' runat="server" BackColor="LightGray" ReadOnly="true" ID="SourceTextBox" /><br />
        RejBy:
        <asp:TextBox Text='<%# Bind("RejBy") %>' runat="server" BackColor="LightGray" ReadOnly="true" ID="RejByTextBox" /><br />
        RejDT:
        <asp:TextBox Text='<%# Bind("RejDT") %>' runat="server" BackColor="LightGray" ReadOnly="true" ID="RejDTTextBox" /><br />
        <asp:LinkButton runat="server" Text="Update" o CommandName="Update" ID="UpdateButton" CausesValidation="True" />
    </EditItemTemplate>
    <InsertItemTemplate>
        CAssetID:
        <asp:TextBox Text='<%# Bind("CAssetID") %>' runat="server" ID="CAssetIDTextBox" /><br />
        Reason:
        <asp:TextBox Text='<%# Bind("Reason") %>' runat="server" ID="ReasonTextBox" /><br />
        Source:
        <asp:TextBox Text='<%# Bind("Source") %>' runat="server" ID="SourceTextBox" /><br />
        RejBy:
        <asp:TextBox Text='<%# Bind("RejBy") %>' runat="server" ID="RejByTextBox" /><br />
        RejDT:
        <asp:TextBox Text='<%# Bind("RejDT") %>' runat="server" ID="RejDTTextBox" /><br />
        <asp:LinkButton runat="server" Text="Insert" CommandName="Insert" ID="InsertButton" CausesValidation="True" />&nbsp;<asp:LinkButton runat="server" Text="Cancel" CommandName="Cancel" ID="InsertCancelButton" CausesValidation="False" />
    </InsertItemTemplate>
    <ItemTemplate>
        CAssetID:
        <asp:Label Text='<%# Bind("CAssetID") %>' runat="server" ID="CAssetIDLabel" /><br />
        Reason:
        <asp:Label Text='<%# Bind("Reason") %>' runat="server" ID="ReasonLabel" /><br />
        Source:
        <asp:Label Text='<%# Bind("Source") %>' runat="server" ID="SourceLabel" /><br />
        RejBy:
        <asp:Label Text='<%# Bind("RejBy") %>' runat="server" ID="RejByLabel" /><br />
        RejDT:
        <asp:Label Text='<%# Bind("RejDT") %>' runat="server" ID="RejDTLabel" /><br />
        <asp:LinkButton runat="server" Text="Edit" CommandName="Edit" ID="EditButton" CausesValidation="False" />
    </ItemTemplate>
</asp:FormView>
<asp:SqlDataSource runat="server" ID="RejSubmitDS" ConnectionString="Data Source=gbaptccsr01;Initial Catalog=CInTracDB;Integrated Security=True" ProviderName="System.Data.SqlClient" SelectCommand="SELECT CAssetID, Reason, Source, RejBy, RejDT FROM RejFailCtrl WHERE (CAssetID = @CAssetID)" UpdateCommand="UPDATE RejFailCtrl SET Reason = @Reason, Source = @Source, RejBy = @RejBy, RejDT = @RejDT WHERE (CAssetID = @CAssetID)">
    <SelectParameters>
        <asp:SessionParameter SessionField="ChangeRecord" Name="CAssetID"></asp:SessionParameter>
    </SelectParameters>
    <UpdateParameters>
        <asp:Parameter Name="Reason"></asp:Parameter>
        <asp:Parameter Name="Source"></asp:Parameter>
        <asp:Parameter Name="RejBy"></asp:Parameter>
        <asp:Parameter Name="RejDT"></asp:Parameter>
        <asp:Parameter Name="CAssetID"></asp:Parameter>
    </UpdateParameters>
</asp:SqlDataSource>
<br />
<asp:Button runat="server" ID="RejectResetBtn" Visible="false" OnClick="RejectResetBtn_Click" Text="*** After Entering your Comment Click this bar!! ****" ForeColor="White" BackColor="Red" />
</asp:Panel>

背后的C#代码和阻塞点是:

TextBox uname = (TextBox)RejSubmittFV.Row.FindControl("RejByTextBox");

通过评论在此代码块中也失败的部分,我测试了另外两点。基本上每次重复此代码序列时,它都会呈现此错误。以下是完整的代码块供您参考:

protected void RejectBtn_Click(object sender, EventArgs e)
{
TextBox uname = (TextBox)RejSubmittFV.Row.FindControl("RejByTextBox");
if (uname != null)
    uname.Text = Session["RegUser"].ToString();

TextBox usource = (TextBox)RejSubmittFV.Row.FindControl("SourceTextBox");
if (usource != null)
    usource.Text = "CInTrac";

TextBox udate = (TextBox)RejSubmittFV.Row.FindControl("RejDTTextBox");
if (udate != null)
udate.Text = DateTime.Now.ToString("MM/dd/yyyy");
}

就像我提到的那样,这个程序在其他地方工作得很好,所以我不知道为什么它不在这里。

任何想法都会非常感激!

2 个答案:

答案 0 :(得分:0)

我看到你期望存在的两个可能为null的项目:

  1. RejSubmittFV.Row属性。在您提供的代码中,我们未对其进行分配,因此我们无法确定您是否正在初始化该对象。
  2. Session["RegUser"]在您尝试拨打.ToString()之前未经过空值测试。
  3. 如果您能够使用调试器,那么这些是要查找的操作类型。您可以为这些值添加监视,也可以只悬停鼠标并查看每个引用是否为空。

答案 1 :(得分:0)

我从来没有想过这个问题的真正答案!我最终解决这个问题的方法是消除ForrView并简单地将5个数据字段放在一个面板中,我通过ID控制可见性,这消除了必须导航FindControl的问题。这导致放弃SqlDataSource并通过存储过程进行更新,并且100%使用代码,因此结果更加清晰。

// Update the Control file 
SqlConnection UpdRejConnection = new SqlConnection("Data Source=GBAPTCCSR01;Initial Catalog=CInTracDB;Integrated Security=True");

SqlCommand Updcmd = new SqlCommand();
SqlDataReader Updreader;

Updcmd.Parameters.AddWithValue("@CAssetID", Session["ChangeRecord"]);
Updcmd.Parameters.AddWithValue("@Reason", ReasonTextBox.Text.ToString());
Updcmd.Parameters.AddWithValue("@Rejby", RejByTextBox.Text.ToString());
Updcmd.Parameters.AddWithValue("@Source", SourceTextBox.Text.ToString());
Updcmd.Parameters.AddWithValue("@RejDT", RejDTTextBox.Text.ToString());

Updcmd.CommandText = "usp_UpdRejCtrl";
Updcmd.CommandType = CommandType.StoredProcedure;
Updcmd.Connection = UpdRejConnection;

UpdRejConnection.Open();
Updreader = Updcmd.ExecuteReader();
UpdRejConnection.Close();