我在这里完全失败了!也许有人会看到我遗失的东西。我在其他地方使用相同的代码,它工作得很好。目的是使用我想为用户提供的数据为编辑模式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" /> <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");
}
就像我提到的那样,这个程序在其他地方工作得很好,所以我不知道为什么它不在这里。
任何想法都会非常感激!
答案 0 :(得分:0)
我看到你期望存在的两个可能为null的项目:
RejSubmittFV
和.Row
属性。在您提供的代码中,我们未对其进行分配,因此我们无法确定您是否正在初始化该对象。Session["RegUser"]
在您尝试拨打.ToString()
之前未经过空值测试。如果您能够使用调试器,那么这些是要查找的操作类型。您可以为这些值添加监视,也可以只悬停鼠标并查看每个引用是否为空。
答案 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();