在Windows窗体中,我在load事件中调用了一个方法。在那里我用这个填充一些TextBox:
foreach (TabPage page in tabControl_Berichte.TabPages)
{
uc_MusterberichtProzessdetails bla = (uc_MusterberichtProzessdetails)page.Controls[0];
object val = musterbericht.GetType().GetProperty(page.Name + "_Bem").GetValue(musterbericht, null);
bla.tB_Bemerkung.Text = val.ToString();
val = musterbericht.GetType().GetProperty(page.Name + "_Bearb").GetValue(musterbericht, null);
bla.tB_Bearbeiter.Text = val.ToString();
val = musterbericht.GetType().GetProperty(page.Name + "_Datum").GetValue(musterbericht, null);
bla.tB_Datum.Text = val.ToString().Substring(0, 10);
val = musterbericht.GetType().GetProperty(page.Name + "_Erledigt").GetValue(musterbericht, null);
bla.chB_Erledigt.Checked = (bool)val;
val = musterbericht.GetType().GetProperty(page.Name + "_Dauer").GetValue(musterbericht, null);
bla.tB_Dauer.Text = val.ToString();
}
除了作为DateTime的“_Datum”之外,所有属性都是字符串? 调用该方法时,将为每个TabPage加载数据。
在我的示例中,一个TabPage加载正确。在第2个TabPage,Date属性为null。所以在此之后:
val = musterbericht.GetType().GetProperty(page.Name + "_Datum").GetValue(musterbericht, null);
val为空。
在下一行:
bla.tB_Datum.Text = val.ToString().Substring(0, 10);
我可以在调试期间看到当鼠标悬停ToString()时会显示“”(空字符串)。 但如果我现在点击F10,我的表格将会显示。该方法是停止的。该程序运行(以下TextBox和选项卡未填充数据)。
没有例外!!我不明白。并且没有任何尝试捕获。
如果我直接使用设置为null的对象尝试此操作,则会抛出异常。
那么这里发生了什么?为什么我的程序仍然有效?
(现在我测试每个val = ...如果val!= null,那么这不是问题。)
编辑:
我刚尝试过这个:
DateTime? dttest = null;
object objtest = dttest;
string strtest = objtest.ToString();
这里我在ToString()处得到一个例外。
在上面的例子中我也试过
val = musterbericht.GetType().GetProperty(page.Name + "_Datum").GetValue(musterbericht, null);
if (val.ToString().Length > 0)
bla.tB_Datum.Text = val.ToString().Substring(0, 10);
这里几乎与上面的行为相同。此处方法在if (val.ToString().Length > 0)
处停止,并且正在中止加载事件。 (仍然不例外)
看起来val.ToString()
正在运行,但val.ToString().xxxxx
会导致这种奇怪的行为。
答案 0 :(得分:1)
您可以查看msdn docs,或使用reflector / dotPeek查看Nullable<T>
覆盖ToString()
,如果为空,则返回""
,而不是投掷。
DateTime?
只是Nullable<DateTime>
,这就是为什么你得到一个空字符串而且没有例外。
修改:当.Substring(0, 10)
执行时,该方法可能会“结束”,因为您将获得ArgumentOutOfRangeException
。空字符串的长度为0,因此您不能要求长度为10的子字符串。