2012-05-17 41 views
2

我想不通爲什麼我無法趕上通過MS圖表控件拋出的異常。我正在使用Visual Studio 2010和最新更新。感謝您的幫助。無法趕上MS圖表控制例外

下面是如何重新產生問題:

  • 創建一個新的WinForms應用程序
  • 參考,System.Windows.Forms.DataVisualization
  • 添加在主窗體拖放一個按鈕和一個圖表控件
  • 添加以下代碼窗體的構造

    int[] x = new int[] { 1, 2, 3, 4, 5 }; 
        int[] y = new int[] { 5, 13, 4, 10, 9 }; 
        chart1.Series[0].Points.DataBindXY(x, y); 
    
  • 下面的代碼添加到該按鈕的點擊方法

    try 
        { 
         chart1.Series[0].Label = "#VAL{"; 
        } 
        catch 
        { 
         MessageBox.Show("Exception caught"); 
        } 
    
  • 運行應用程序
  • 單擊窗體

catch塊以上從不執行上的按鈕。取而代之的是「InvalidOperationException異常」的標籤字符串中無效關鍵字的使用拋出冒泡到應用程序的主要方法。

+0

你是從另一個線程做到這一點嗎? – leppie

+0

不是。重現我提到的問題的步驟使用標準的單線程winforms應用程序模板。 – veezi

回答

1

這不是控制一種罕見的故障模式。問題在於,Label屬性的屬性設置器沒有執行足夠的檢查來驗證分配的值是合法的。所以當實際使用屬性值時,這會出錯。之後,當控件自己繪製時。在調用堆棧窗口中很容易看到,請注意Chart.OnPaint()如何在堆棧頂部。調試器在Application.Run()處停止,因爲這是它實際上具有源代碼的最後一個語句。所以請確保你在調用堆棧中查找。

有針對此在的WinForms對策,該Application.ThreadException事件將觸發。但是,當您調試時會關閉該功能,以幫助您診斷異常。無論如何,ThreadException的事件處理程序無法修復代碼中的錯誤。您可以捕獲異常,你就必須強制重繪所以畫不被延遲,並會轟炸,而你的try塊仍然有效:

private void button1_Click(object sender, EventArgs e) { 
     try { 
      chart1.Series[0].Label = "#VAL{"; 
      chart1.Refresh(); 
     } 
     catch { 
      MessageBox.Show("Exception caught"); 
     } 
    } 

但要麼不是一個真正的解決,它會在下一次重畫時再次彈出。除非您在catch塊中重新分配Label屬性。唯一真正的解決辦法是修復代碼。如果您允許用戶輸入標籤,則此解決方法應該很好,只需確保重置catch塊中的標籤。

+0

有道理!感謝您解釋它。 – veezi

+0

重置catch塊中的正確標籤後,圖表不會刷新。但我猜這是一個不同的問題。希望屬性設置者執行所需的檢查,或者如果該類提供了ValidLabel()方法。無論如何 .. – veezi

0

Chart.Area.RecalculateAxesScale()也可以使用,如果Chart.Refresh()由於某種原因不可用。