- - PR -
2次元配列をプロパティに使用したい
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2009-04-08 11:25
いつもお世話になっております。
今回の質問は2次元配列をプロパティに使用することはできるのか?ということです。 コンパイルは通るのですが、デザイナ側で怒られてしまうようです。 メッセージは「配列ランク'2'が高すぎます・・・」です。 デザイナに表示しなければ大丈夫なのかと思い、BrowsableをFalseにしてみましたが、 ただ単に見えなくなるだけみたいで・・・。 デザイナで完全に使用しない方法とかがあれば良いのですが、現状ではわかりません。 他の解決は知っていますが、単純にできないものかな〜?といった疑問です。 わかる方がいましたら、私の疑問を解決してください。 よろしくお願いします。 | ||||||||||||
|
投稿日時: 2009-04-08 11:33
デザイナ? Windows フォーム? WPF ? ASP.NET ? それとも実はモバイル?
Visual Studio のバージョンは? そもそも言語は何? どんなコードを書いてデザイナでエラーになるんでしょう? 他の解決策って何でしょう? | ||||||||||||
|
投稿日時: 2009-04-08 11:45
すみません、肝心なことを書いていませんでした。
VS2005で言語はVB.Netになります。 他の解決策はプロパティにせずメソッドにするか、 2次元配列でプロパティにするのをやめるという方向です。 以下サンプルコードです。 デザイナを開かなければ問題なく使用できます。 private _testValue(,) as Integer '*********************************************************** ' Property TestValue(X,Y) '*********************************************************** <System.ComponentModel.Browsable(False)> _ Public Overridable Property TestValue() As Integer(,) Get Return _testValue End Get Set(ByVal value As Integer(,)) _testValue = value End Set End Property | ||||||||||||
|
投稿日時: 2009-04-08 12:16
内容としてはこれだと思うのですが、
http://msdn.microsoft.com/ja-jp/library/0st0aaz7.aspx KT 工房さんのコードをコピペしたのに再現できなくて困っています。orz (継承された Form、拡張コントロールの 2 つで試しました)
元質問の答えにはなりませんけども後者が賢明だと思いますね。 多次元配列をプロパティに使うことは皆無に等しいです。 多段階配列に近い構造を持つデータのコンテナ (Collection や List なども含む) で実装するのが一般的ですから。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2009-04-08 12:36
VS2005 の環境が無くて試していませんが、
System.ComponentModel.DesignerSerializationVisibilityAttribute を指定したら回避できたりしませんか?
ただ、回避できるかも知れないというだけなので、じゃんぬねっと さんも書かれている通り、別の実装方法を検討した方が良いのではと思います。 | ||||||||||||
|
投稿日時: 2009-04-08 13:29
返答ありがとうございます。
>じゃんぬねっとさん 実際にはパネルを継承したコントロールにプロパティを追加しています。 現象はこのコントロールをフォームに貼り付けし、デザイナ側で保存がされるタイミング?で発生しています。 >お ださん 指摘の「DesignerSerializationVisibilityAttribute」試してみましたが、 結果は残念ながら同じでした。 確かに2次元の配列を使うのはよろしくないのはわかりますが、 等高線を描くようなコントロールを作ろうとしていまして・・・。 そのため、ListやCollectionだと使い勝手が良くないのです(泣) コンバートするメソッドを作れば良いのですが、面倒ですし。 実際にはデザイナでは使うことがないので、デザイナで無視できれば良いのですが・・・。 | ||||||||||||
|
投稿日時: 2009-04-08 14:34
ごめんなさい。 どこがどう "そのため" なのかわかりません...。 "等高線" ということは x と y を持つ 「点」 を表しているという理解でよろしいでしょうか? であれば、System.Drawing.Point 構造体 (でなくてもいいけど、そういう代物) の List の方がまだ良いのではないでしょうか?
コンバートの必要はないような気がします。
私の方ではなぜか再現できないので試せないのですが、シグネチャが原因なので な け れ ば 、DesignMode プロパティで解決できると思います。 シグネチャでも許されないのであれば DesignMode プロパティは適用できないので無理ですね。 あるいはカスタム デザイナで無視できるかもしれません (IDE 周りは特に疎いのでデタラメを言っているかもしれません)。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2009-04-08 15:06
単純に点ではなく、X,Yの位置にある値を確保したいということになります。
なおかつ複数点の値を同時に取得したいので、 Listだと該当のポジションを探さなくてはならなくなり面倒だと思いまして。 当初の設計では ・Xの値 ・Yの値 ・該当座標の値 の構造で持っていたのですが、どうにも使い勝手が良くなくて2次元配列にしました。 (X,Y)から値を取得できるメソッドを持たせればいいんですけど、 毎回ループするのもよろしくないのかと。 コンバートというのは上記構造でプロパティ上は持たせておいて、 実体は2次元配列で持とうかという考えで出てきました。 別にプロパティにこだわらなければ、Publicの変数にしても良いかな?と思ってきました(汗) 警告やエラーではなく、デザイナが何か変更があり保存されるタイミングのみにメッセージボックス「配列ランク'2'が高すぎます・・・」が表示されるだけです。 以降デザイナで変更がなければ表示されることはありません。 ですので、該当のプロパティをデザイナ側で保存する対象から外せれば解決のような気がしますが・・・。 じゃんぬねっとさんのほうで再現できないと言うことは、 もしかするとサービスパックなどの環境により出ない場合も考えられますね。 ちなみに私はSP2でした。 |