我已经解决了这个问题(解释如下),但我正在试图弄明白为什么堆栈跟踪给了我错误的行。
概述:
这是一个中继器控件,允许教授在一次一个问题的情况下标记一个考试,同时仍然可以查看整个考试。
<asp:repeater>
<ItemTemplate>
<fields/>
<textbox id="grade">
<asp:LinkButton ID="UpdateButton" runat="server" Text="Update" OnClick="OnUpdate" />
</ItemTemplate>
</asp:repeater>
用户应该输入成绩,并且在OnClick事件中在数据库中更新问号,然后再次对整个页面进行数据绑定。
代码:
protected void OnUpdate(object sender, EventArgs e)
{ // I broke this down line by line trying to trace the error.
LinkButton button = (LinkButton)sender; //Object Not set exception here!!!
object o = button.Parent;
RepeaterItem item = o as RepeaterItem;
int StudentID = int.Parse((item.FindControl("StudentKeyLabel1") as HiddenField).Value);
string ExamID = (item.FindControl("ExamIDLabel1") as HiddenField).Value.Trim();
int QuestionID = int.Parse((item.FindControl("QuestionIDLabel1") as HiddenField).Value);
int Grade;
try
{
Grade = int.Parse((item.FindControl("GradeTextBox") as TextBox).Text);
// Update DB
}
catch (FormatException)
{ // Message to user - bad or missing grade }
//Custom Databind
}
我已经将.aspx中的字段从标签更改为aspx中的隐藏字段,但是忘记在.aspx.cs文件中更改它们——这是错误的实际原因。
但是,堆栈跟踪(customerrors=“Off”)显示对象引用未设置为在此行发生的类型Object:
LinkButton button = (LinkButton)sender; //Object Not set error here!!!
但实际的误差在下面几行。
因为这个,我的疏忽花了很长时间才解决。你可以看到,我逐行分解了RepeaterItem的检索,并将
throw new Exception(xxx.GetType().ToString()
为什么堆栈跟踪显示异常来自代码中的错误位置?