C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: InvalidCastExceptionの回避方法について


(過去ログ 87 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■51800 / inTopicNo.1)  InvalidCastExceptionの回避方法について
  
□投稿者/ ペケ (1回)-(2010/07/20(Tue) 11:52:55)

分類:[VB.NET/VB2005 以降] 

初めまして、ペケと申します。

こちらでいいのか分かりませんが、以下の事象につきまして質問させていただきます。

<開発環境>
 VB.net 2008 mobile
  .NET Compact Framework Version 2.0

<プラットフォーム>
 Windows CE

<PDA端末>
 Casio DT-X7

<やりたいこと>
NumericUpDownコントロールを継承し、GotFocus、LostFocusイベントで
フォーカス取得時のコントロール背景色を変更する。

<InvalidCastException発生のタイミング>
デバッグ実行時

<ソース>
1.まず、NumericUpDownコントロールを継承。

  public class UC_NumericUpDown
    Inherits System.Windows.Forms.NumericUpDown

    'とりあえずソースなし
  end Class

2.上記コントロールをビルド後、他プロジェクトのForm1に、作成したコントロールを配置。
 その際、Form1に自動生成されたソース(Form1.Designer.vb)は以下の通り。

  'メモ: 以下のプロシージャは Windows フォーム デザイナで必要です。
  'Windows フォーム デザイナを使用して変更できます。
  'コード エディタでこのプロシージャを変更しないでください。
  <System.Diagnostics.DebuggerStepThrough()> _
  Private Sub InitializeComponent()
    Me.mainMenu1 = New System.Windows.Forms.MainMenu
    Me.UC_NumericUpDown1 = New SmartDeviceProject1.UC_NumericUpDown
    Me.NumericUpDown1 = New System.Windows.Forms.NumericUpDown
    CType(Me.UC_NumericUpDown1, System.ComponentModel.ISupportInitialize).BeginInit() ’※1

3.デバッグ実行時、上記ソース(Form1.Designer.vb)内の※1の行で
 InvalidCastExceptionエラーが発生。


----
上記の様に、単純にコントロールを継承し、フォームに貼り付けただけなのですが
自動生成ソース部分でエラーが発生してしまいます。
※コントロールの背景色を変える部分は問題ありません。

自分に継承関連の知識が薄いのもあると思いますが、どうにも解決できませんので
ご回答可能な方が見えましたら宜しくお願い致します。

引用返信 編集キー/
■51801 / inTopicNo.2)  Re[1]: InvalidCastExceptionの回避方法について
□投稿者/ 魔界の仮面弁士 (1708回)-(2010/07/20(Tue) 12:12:21)
魔界の仮面弁士 さんの Web サイト
No51800 (ペケ さん) に返信
とりあえずの回避策。

Imports System.ComponentModel

Public Class UC_NumericUpDown
    Inherits System.Windows.Forms.NumericUpDown
    Implements ISupportInitialize

    Private Sub DummyOfBeginInit() Implements ISupportInitialize.BeginInit
    End Sub

    Private Sub DummyOfEndInit() Implements ISupportInitialize.EndInit
    End Sub
End Class

引用返信 編集キー/
■51802 / inTopicNo.3)  Re[2]: InvalidCastExceptionの回避方法について
□投稿者/ ペケ (2回)-(2010/07/20(Tue) 13:16:15)
No51801 (魔界の仮面弁士 さん) に返信
> ■No51800 (ペケ さん) に返信
> とりあえずの回避策。
>
> Imports System.ComponentModel
>
> Public Class UC_NumericUpDown
> Inherits System.Windows.Forms.NumericUpDown
> Implements ISupportInitialize
>
> Private Sub DummyOfBeginInit() Implements ISupportInitialize.BeginInit
> End Sub
>
> Private Sub DummyOfEndInit() Implements ISupportInitialize.EndInit
> End Sub
> End Class

魔界の仮面弁士 さん。
お世話になっております。

上記のようにコーディングしてみたところ、解決できました。
とはいえ、Implementsの件や、ISupportInitialize.BeginInit等、知識に
ないことばかりでしたので一から勉強しなおそうと思います。

ありがとうございました。

解決済み
引用返信 編集キー/
■51810 / inTopicNo.4)  Re[3]: InvalidCastExceptionの回避方法について
□投稿者/ 魔界の仮面弁士 (1709回)-(2010/07/20(Tue) 23:16:41)
魔界の仮面弁士 さんの Web サイト
2010/07/20(Tue) 23:28:52 編集(投稿者)

No51802 (ペケ さん) に返信
> 自動生成ソース部分でエラーが発生してしまいます。
開発環境側の不具合のようですね。
NumericUpDown 以外にも、DataGrid で同様の現象が発生することが報告されています。


> 自分に継承関連の知識が薄いのもあると思いますが、どうにも解決できませんので
.NET Framework 版の System.Windows.Forms.NumericUpDown クラスには、
ISupportInitialize インターフェイスが実装(Implements)されています。
しかし、.NET Compact Framework 版の方には実装されていません。

にもかかわらず Visual Studio の開発環境は、.NET Compact Framework 環境でも
UC_NumericUpDown に ISupportInitialize があるものと誤解しているため、
今回の型変換エラーが発生しているようです。

そのため今回は、ISupportInitialize への変換を成功させるためだけに、
UC_NumericUpDown に Implements ISupportInitialize を加えた次第です。


> ISupportInitialize.BeginInit等
ISupportInitialize は、初期化処理を一括しておこなうためのインターフェイスです。


たとえば NumericUpDown の場合、最大値と最小値を設定できますよね。

当然ながら、各値は常に「最小値≦現在値≦最大値」の関係に無ければいけませんが、
初期化処理中は、その関係が一時的に崩れてしまう事をあえて容認したい事もあります。

そのため、初期化処理をひとまとめにするためのルールとして、
以下のような処理手順が考えだされました。

 obj.BeginInit()  '初期化処理の開始(値チェック機構の抑制)
 obj.Maximum = 12345
 obj.Minimum = 123
 obj.Value = 1234
 obj.EndInit()   '初期化処理の終了(値チェック機構の復活)

そして ISupportInitialize インターフェイスは、それを実装したクラスが
上記の BeginInit/EndInit パターンでの初期化に対応しているということを
保証するために使われています。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -