2013-07-23 60 views
0

在一個windows窗體中,我在load事件中調用一個方法。在那裏,我填補一些文本框與此:爲什麼這段代碼無異常工作

 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(); 
     } 

所有屬性除「_Datum」,這是一個DateTime的字符串? 當調用該方法時,將爲每個TabPage加載數據。

在我的示例中,一個TabPage加載正確。在第二個TabPage中,日期屬性爲空。因此,在此之後:

val = musterbericht.GetType().GetProperty(page.Name + "_Datum").GetValue(musterbericht, null); 

val爲空。

在下一行:

bla.tB_Datum.Text = val.ToString().Substring(0, 10); 

我可以調試當鼠標懸停的ToString()中,示出「」(空字符串)中看到。 但是,如果我現在單擊F10,我的表單將顯示。該方法已停用。程序運行(以下文本框和選項卡未填充數據)。

有沒有例外!我不明白。而且沒有任何地方嘗試捕捉。

如果我直接用一個對象設置爲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

'Nullable 'overrode'ToString'不在'null'上引發異常。 –

+0

出於好奇,所有的反思是什麼? 「TabPage」對象的每個實例是否有不同的屬性名稱集合?這當然是非常規的。 – nicholas

+0

@newStackExchangeInstance,如你所說,'DateTime?'又名'可空 .ToString()'返回一個空字符串,而不是拋出異常。這是問題的答案,爲什麼不把它作爲答案? – nicholas

回答

1

您可以檢查msdn docs,或使用反射/ dotPeek看到Nullable<T>覆蓋ToString()返回NULL的""如果不是拋出。

DateTime?只是Nullable<DateTime>,這就是爲什麼你得到一個空字符串,並沒有例外。

編輯:.Substring(0, 10)執行時,該方法可能「結束」,因爲您將獲得ArgumentOutOfRangeException。空字符串的長度爲0,因此您不能要求長度爲10的子字符串。

+0

謝謝,多數民衆贊成在正確的。但是仍然沒有答案,爲什麼當有一個'Nullable .ToString()。Substring(10)'? – RodMcKay

+0

同樣的情況發生,如果我做'如果(val.ToString()。長度> 0)'。似乎只有'ToString()'正在工作,但'ToString()。xxxx'會導致這種行爲。 – RodMcKay

+0

剛剛更新了答案。我可以做'val.ToString().length'就好了,它會返回0.但是'val.ToString()。Substring(0,10)'會拋出一個異常,因爲空字符串的長度小於10. – Alden

相關問題