2011-08-16 28 views
1

私は、組み込みシステムから取得して設定したデータを制御するWinforms PropertyGridをc#に持っています。プロパティグリッドによってスローされた例外を処理する方法は?

デバイス(GetFrequency、SetPowerLimit、SetACCurrentなど)に関するクエリをプロパティとして書き込み、作成したいフォーム内の各コマンドに別のメソッドを書き込まずにデータをバインドできるようにしました。

PropertyGridは本当にうまく機能します。つまり、必要なすべてのデータが表示され、値を変更できるようになります。しかし必ずしもそうではありません。

このブラックボックスは、動作する必要があるため、プログラムは通常いくつかの点で停止します。 (デバイスの電源を切ったときなど)

たとえば、デバイスから頻繁に読み込む必要がある値は次のとおりです。 "Simin"

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

ゲッターとセッターの中には、これらの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); 
      } 

同様

だから私は3つの抽象化層を持っていると私はいくつかを読み取ろうとしながら、私は(上記の図のような)機械側からの例外を取りますデータ。私は最初にそれらのいくつかをキャッチしようとしました

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

winformの初期化時には動作しませんでした。

私の問題は、ボタンやテキストフィールドの場合は、イベントメソッドで例外を簡単にキャッチできますが、PropertyGridによってスローされた例外を処理することはできません。

+2

私の最初のDownvoter、あなたは少なくともコメントを残すことができます。しかし、あなたは自分自身を改善している人たちがあなたをしているのを見たくないのですか? – 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クラスのプロパティまたはフラグ(たとえば、ErrorまたはCommunicationError)を設定しないでください。

TypeConverter他のプロパティにアクセスする前にこのプロパティをチェックしてください。エラーの場合は、baseの実装を呼び出すことなくConvertFrom()から戻ってください。エラーが回復可能な場合(通信エラーのように見える場合)、例外をスローするのではなく、ユーザーが再試行できるようにします。

さらに、クラスにデバイスパラメータを直接マッピングし、プロパティグリッドで使用するがデバイスに書き込まないようにするプロパティを持つ場合は、カスタム属性ブール値DeviceWritable)。通信層(実際にデバイスに値を書き込む)で、このカスタム属性がtrueに設定されているかどうかを確認し、デバイスに書き込むか、デバイスに書き込まないでください。

+0

ありがとうございました!私は、私がコンボボックス、テキストフィールドなどを持っているこれらすべての問題から私を救うと思います。 ;)しかし、私はまだ私のデバイスから直接来たこれらの例外を取り除く方法を見つける必要があります。 – 3yanlis1bos

+0

「デバイス」が例外をスローしている理由がわからないのに、私は与えられた例を反映するために答えを更新しました!エラーが発生した場合は、エラーとそのタイプを示すエラーフラグまたはレジスタをデバイス上に持つ必要があります。 –

+0

例外を投げるデバイスが主に通信の誤動作の原因です。だから私が読んだバイトが予期せぬものであるなら、私のマシンがオンでないか、遅いかRS232ケーブルが焼けている、ec ..なので、いくつかのエラーでは、DeviceWritableメソッドでさえも作業。私はあなたが言及した登録があると思う。すべての予期可能な(forseen)エラーについては、私は、デバイスからエラーを読み取る方法があります。しかし、予期せぬ(本当にばかげたバグの)ものについては、私は推測するこれらの例外をスローする必要があります。 – 3yanlis1bos

関連する問題