トップ回答者
.Net Framework 1.1 から 4.0 への移行に関して

質問
-
.Net1.1 から .Net4.0 への移行を実施しております。
【環境】
OS:Windows7
言語:VB.Net
開発環境:VisualStudio2010 Pro
問題のコード
numUpDown.Value = 0 'numUpDown はNumericUpDownクラスのインスタンス
そこで、NumericUpDown.Valueへの設定で以下のような問題が発生しております。
=======================================
【.Net1.1】
・値の変更が即座に反映され、画面に 0 が表示される
【.Net4.0】
・値の変更は反映されるが、画面には空で表示される
=======================================
現在は Textプロパティに変更して対応しておりますが、 .Net1.1 から .Net4.0への
変更で、Valueプロパティの挙動が変更されたなどの記述を見つけることができませんでした。
.Net4.0への移行について、フレームワークの仕様変更をまとめたような情報サイトは
ありますでしょうか。何か情報あればご教示いただければ幸いです。
以上、よろしくお願いいたします。
回答
-
>【.Net4.0で確認した内容】
>・画面に空文字で表示される.NET FrameworkのSource Codeを見れば、hintが得られるでしょう。
NumericUpDown.csのValue property、UpdateEditText()、ValidateEditText()、ParseEditText()あたりでしょうか。
それぞれが呼ばれる機会も確認するとよいでしょう。
また、親classのUpDownBaseも見ると良いです。幾つかのmethodはoverrideできますので、処理の流れやMSDNを確認し、対応方法を精査してみては如何でしょうか。
NumericUpDownは空文字("")自体を許容しているようですね。
- 回答としてマーク nishiyama2017 2011年8月20日 6:43
すべての返信
-
現在は Textプロパティに変更して対応しておりますが、 .Net1.1 から .Net4.0への
変更で、Valueプロパティの挙動が変更されたなどの記述を見つけることができませんでした。
そのような変更は無いと思いますよ。実際に試してみましたが、問題なく画面上も0になりました。 例えばUIスレッド以外から変更されていたりしませんか? .NET 1.1ではこの辺りはゆるかったので何となく動いていました。ただ、スレッドの問題だとすれば.NET 2.0以降は例外が発生するようになったはずなんですが・・・
また、プロジェクトのプロパティで対象のフレームワークを.NET 2.0などに変更した場合、動作が変わりますか?
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/ -
【.Net4.0】
・値の変更は反映されるが、画面には空で表示される
Forms ではこのような事例は聞いたことありませんが、WPF なら同様の現象に遭遇したことがあります。私が携わったプロジェクトで、ほとんどの環境(XP~Win7)では問題なく動作したのですが、かなり旧いマシンに配布し動作させたら WPF コントロールで値は更新されているにも関わらず描画が更新されておらず、画面のサイズを変更すると描画が更新されるという問題が発生しました。
その時はグラフィックドライバを最新に更新、もしくはハードウェアアクセラレータを無効にして解決してます。
ひらぽん http://d.hatena.ne.jp/hilapon/ -
皆様
ご回答ありがとうございます。
申し訳ありません、問題のコードが間違っておりました。
=======================================【問題のコード】
numUpDown.Text = ""
【.Net1.1で確認した内容】
・画面に 0 が表示される
【.Net4.0で確認した内容】
・画面に空文字で表示される
【使用方法】
NumericUpDownクラスを継承し、独自クラスを実装
【現在とっている対策】
現在はTextプロパティを上書きして対応
<Browsable(False)> Public Shadows Property Text() As Object
Get
Return MyBase.Text
End Get
Set (ByVal value As Object)
If "".Equals(value) Then
Return
End If
MyBase.Text = value
End Set
End Property
=======================================
同一クラスの仕様については、同じだろうと高をくくっていたのですが、
このようなちょっとした違いが出てくるのであれば、全体的に見直しかなと思い、
マイグレーションに関して情報がまとまっているサイトなどないか、質問した次第
です。※この対応に関しても、こうやったほうがいい等意見いただけると助かります。
もうちょっと、情報サイトがないかまわってみます。
-
-
> もうちょっと、情報サイトがないかまわってみます。
ここも覗いておいた方がいいかもしれません。
http://www.microsoft.com/japan/net/migration/document35.aspx
http://www.microsoft.com/japan/net/migration/document4.aspx
ひらぽん http://d.hatena.ne.jp/hilapon/- 編集済み ひらぽんModerator 2011年8月18日 5:16 URL追加
-
30分以上遅れて、よく似た内容の返信になりますけど・・・
1つ前のバージョンとの重要な注意点でしたら、各バージョン用の MSDN ライブラリにも記載されてます。
.NET Framework 4 への移行に関する問題
http://msdn.microsoft.com/ja-jp/library/ee941656.aspx.NET Framework 2.0 での重大な変更点
http://msdn.microsoft.com/ja-jp/library/Cc825631
ただ、NumericUpDown.Text プロパティの説明には、
「この API は、.NET Framework インフラストラクチャをサポートします。独自に作成したコードから直接使用するためのものではありません。」
と書かれていますが、このような「.NET Framework のインフラストラクチャ」なものの場合、「ちょっとした違い」はたぶん発生しやすく、発生した場合もドキュメントに書かれない可能性が高いと思います。
(ちなみに私は使用することが悪いとは思ってません。自己責任の範疇と考えています。)今回は 1.1 から 4.0 という大きなバージョンアップですから、全体的な動作確認は避けられないと考えます。
ところで、書かれたコードについては次のことを思いました。
1. なぜ As Object なんでしょうか? As String じゃないですか?
2. 空文字の代入時は MyBase.Value = 0D にすべきじゃないでしょうか?- 編集済み TH01 2011年8月18日 5:57 「相違点」という表現を「重要な注意点」に変更
-
私もさして意見が異なるわけではありません。
自己責任の範疇であり、使用には細心の注意を払い、バージョンアップやパッチ適用などで変更がないか自身でチェックすべきと考えます。
ですので「問題が発生」として他人に質問する行為が自己責任の範疇を超えていて「使用する方が悪い」と思いコメントしました。# 当初気づかずに質問してしまったのは仕方がないとは思いますが。
値0を代入するのもいいですが、
numUpDown.Text = ""
を質問文にある
numUpDown.Value = 0
にするだけですよね。Ver 1.1でもVer 4.0でも有効な処理ですし。NumericUpDownクラスから派生する必要ないのでは。
-
>【.Net4.0で確認した内容】
>・画面に空文字で表示される.NET FrameworkのSource Codeを見れば、hintが得られるでしょう。
NumericUpDown.csのValue property、UpdateEditText()、ValidateEditText()、ParseEditText()あたりでしょうか。
それぞれが呼ばれる機会も確認するとよいでしょう。
また、親classのUpDownBaseも見ると良いです。幾つかのmethodはoverrideできますので、処理の流れやMSDNを確認し、対応方法を精査してみては如何でしょうか。
NumericUpDownは空文字("")自体を許容しているようですね。
- 回答としてマーク nishiyama2017 2011年8月20日 6:43
-
皆様
ご回答ありがとうございます。
NumericUpDownクラスから派生してるのは既存システムにて、もろもろの入力チェックがあり
そちらをカプセル化するために派生したクラスを実装しておりました。
今回のアップデートにより、numUpDown.Text = "" の結果、値が0だったものが""に変更
されていたため、更新時の入力チェックなど、いろいろな箇所で影響が出てしまったため、
(苦肉の策?)としてTextを上書きしてしまいました・・・Valueに変えるのがいいですかね。
(Valueにもりもり書き換えるのは避けたいと考えております。コストの関係です、お察しください・・・)
大きくは調べて、対応の方進めていたのですが、今回のような細かい細かい仕様変更は
想定してなかったので、まとめられてるサイトなどがあればなぁと思い、今回の質問
にいたりました。ちょっと質問が大雑把すぎましたね。失礼いたしました。
もうちょっと調べてみます。ありがとうございました。
-
今回のような細かい細かい仕様変更は想定してなかったので、まとめられてるサイトなどがあればなぁと思い、今回の質問にいたりました。
おそらく、存在しないでしょう。
Microsoft 自身も言われるまで気づかないものもあると思いますし、第三者がまとめ上げるには量が多い&それほど有益に働かないと思われます。
(.NET 1.1 から .NET 4 は、CLR という土台からの変更が 2 度あることになります)今回のような開発環境を変えた、ミドルウェアや OS を変えたと言うときは、全体的にテストしなおす、問題が発生したときに対応できる期間を設けておくということが必要でしょう。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。