2011-08-16 30 views
1

我有一個C#Winforms PropertyGrid控制從嵌入式系統獲取和設置的數據。如何處理由propertygrid拋出的異常?

我將關於設備(GetFrequency,SetPowerLimit,SetACCurrent e.c.)的查詢寫爲屬性,以便我可以綁定數據,而無需爲要創建的窗體內的每個命令編寫另一個方法。

PropertyGrid的工作非常好,我的意思是它顯示我需要的所有數據,並讓我改變它們的值。但當然不總是。

由於必須處理的設備的這種黑盒子問題,程序通常在某些點停止。 (即關閉設備時)。

例如,這裏是我必須經常從設備讀取的值。 「Simin」

[Category("Editable Values"), Description("Sets the minimum select...")] 
    public Ampere Simin 
    { 
     get 
     {...} 
     set 
     {...} 
    } 

在Getters和Setters中,我有這些get方法建立pc和設備之間的連接。它們是我主要採用的例外的實際來源。

喜歡這張

if (!_port.IsOpen) 
     { 
      throw new HuettingerException(Localisation.Error_PortClosed); 
     } 

或該

// Read first 4 bytes 
      if (_port.Read(inputv, 0, 4) != 4) 
      { 
       throw new HuettingerException(Localisation.Error_NoConnection); 
      } 

所以我有三個抽象層和我是否從機側的異常(如上所示的一個),而我嘗試讀一些數據。我試圖在開始時捕捉其中的一些像

public DeviceUI() 
    { 
     InitializeComponent(); 
     try 
     {     
      propertyGrid1.SelectedObject = device; 
     } 
     catch (TimeoutException te) // i tried other exceptions too 
     { 
      MessageBox.Show(te.Message); 
     } 

在winform的初始化,但它沒有工作。我的問題是,如果它是一個按鈕或文本框,我可以很容易地捕捉事件方法中的異常,但我不知道如何處理由PropertyGrid拋出的異常。

有沒有意見?

+2

親愛的第一位羽衆,你至少可以發表評論。但是你不喜歡看到人們自我改善嗎? – 3yanlis1bos

+2

我不是downvoter,我可能沒有downvoted - 但它可能是由於缺乏一些代碼說明你如何使用PropertyGrid。 – iandotkelly

+0

什麼時候拋出這些異常?當用戶在屬性網格中編輯值時,或者通過代碼中的某個事件更新值時? –

回答

2

如果在轉換(分配值)時(即調用TypeConverter.ConvertFrom()時)拋出的異常到屬性網格中的屬性(例如,InvalidCastException),則可以捕獲該屬性的TypeConverter

class MyTypeConverter : TypeConverter 
{ 
    public override bool ConvertFrom(ITypeDescriptorContext context, Type sourceType) 
    { 
     try 
     { 
      return base.ConvertFrom(context, sourceType); 
     } 
     catch(Exception e) 
     { 
      // Process the exception (for example, Log(e)) or Debug.Assert() 
      throw; 
     } 
    } 
} 

// Using the TypeConverter in your class 
class MyClass 
{ 
    [ReadOnly(false)] 
    [PropertyOrder(1)] 
    [DisplayName("Property 1")] 
    [TypeConverter(typeof(MyTypeConverter))] 
    public int Property1 
    { 
     get; 
     set; 
    } 
} 

您也可以相應地覆蓋基類TypeConverter的其他方法。

以您添加的示例爲例,您似乎希望推導出與設備通信失敗的原因(端口未打開等)。那麼爲什麼不在Device類中設置屬性或標誌(例如,ErrorCommunicationError),以告知是否發生了特定錯誤。

然後在TypeConverter檢查訪問其他的屬性,如果錯誤,則簡單地從ConvertFrom()返回,而不調用base實施前該屬性。如果錯誤是可恢復的,在你的情況下,這似乎是一個通信錯誤,那麼允許用戶重試,而不是拋出異常。此外,如果您將設備參數直接映射到類上,並且您有屬性在屬性網格中使用,但不希望將其寫入設備,則可以使用自定義屬性(說布爾DeviceWritable)。在通信層(實際上將值寫入設備的位置)中,檢查此自定義屬性(如果設置爲true,則寫入設備,否則不寫入設備)。

+0

非常感謝您的幫助!我認爲它可以幫助我解決所有這些問題,包括使用其他組合框,textfields等。 ;)但我仍然需要找到一種方法來擺脫直接來自我的設備的這些異常。 – 3yanlis1bos

+0

我已經更新了答案,以反映給出的例子,但我不確定爲什麼'device'拋出一個異常!如果出現錯誤,您應該在設備上顯示一個錯誤標誌或一個或多個註冊表示錯誤及其類型。 –

+0

設備拋出異常的原因主要是通信故障。所以,如果我讀取的字節是意外的,那麼無論是我的機器還是沒有運行,或者它運行緩慢,或者我的RS232電纜燒燬了,所以在一些錯誤中,我確信即使DeviceWritable方法也不會工作。我想我有你提到的註冊表。對於所有可能的(forseen)錯誤,我有一個方法來讀取設備中的錯誤。但對於不可思議的(真正愚蠢和越野車),我必須拋出這些例外。 – 3yanlis1bos

相關問題