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

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

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

Re[5]: カスタムコントロールの作成(.Net 4)


(過去ログ 97 を表示中)

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

■58121 / inTopicNo.1)  カスタムコントロールの作成(.Net 4)
  
□投稿者/ めめ (24回)-(2011/03/25(Fri) 17:57:36)

分類:[.NET 全般] 


こんにちは
カスタムコンポーネントの作成について質問です。

環境
Windows7 pro 64bit
.net Framework 4.0 Client

C#でボタンを拡張したものや、罫線を引くなどのカスタムコンポーネントが作っていきたいのですが、
参考1より、どうせならGUIでプロパティなんかを設定できるコンポーネントが作りたいと思いました。

しかし、.net4ClientではSystem.Designは参照で追加できませんでした。(参考2より)
ただ、直接DDLファイルを取得することで参照に追加できてしまいました。
プログラムも実行できるところまできていますが、参照先がv2.0を利用しているのも気になっています。

ファイルの参照先
C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Design.dll


そこで質問させて頂きたいのは、3点です。
まず、1点目が、この参照は危険なことなのかどうなのか? ということ。

そして、2点目が、全てのプロパティが時々画面上に表示されなくなったりします。(GUIでパラメータをいじれない)
ControlDesignerクラスのPostFilterPropertiesをoverrideして、
標準で用意されているが不要なプロパティを4つ非表示にしたのが原因かもしれませんが、
こういった現象は、過去の.netのバージョンでも発生するようなものだったのでしょうか?

最後に、3点目が、カスタムコンポーネントはそもそもGUIを考慮せずに作成するものなのかという点です。
空白のコンポーネントをGUIで配置して、後はプログラムで操作するような感じがデフォルトで、
あまりGUIで設定するところまでやらないものなのか、というのが気になっています。

以上、よろしくお願いします。


参考
1.http://www.atmarkit.co.jp/fdotnet/winexp/winexp02/winexp02_03.html
2.http://social.msdn.microsoft.com/Forums/ja-JP/vsgeneralja/thread/0e79f35b-6f75-41f7-a950-587cf7b99358


引用返信 編集キー/
■58127 / inTopicNo.2)  Re[1]: カスタムコントロールの作成(.Net 4)
□投稿者/ Azulean (715回)-(2011/03/25(Fri) 23:52:48)
No58121 (めめ さん) に返信
> まず、1点目が、この参照は危険なことなのかどうなのか? ということ。

.NET 4 でありながら、.NET 2.0 が必要な状態になっているわけです。
.NET 2.0 が入っていない状態で、.NET 4 Client Profile が入っているという環境もありうるので、これは解決になっていませんし、明確な理由なしに 2.0 のアセンブリを混ぜることはおすすめしません。(危険ではないと思いますが、一般解とはとても言えません)

Type じゃなくて、string を指定するやり方なら、デザイン時のみ .NET 4 Extend が必要という形にできるかもしれませんね。
(リンクされているスレッドで佐祐理さんが述べられていましたよね)


> そして、2点目が、全てのプロパティが時々画面上に表示されなくなったりします。(GUIでパラメータをいじれない)
> ControlDesignerクラスのPostFilterPropertiesをoverrideして、
> 標準で用意されているが不要なプロパティを4つ非表示にしたのが原因かもしれませんが、
> こういった現象は、過去の.netのバージョンでも発生するようなものだったのでしょうか?

どんなコードになっているのかわからないので、何とも言えません。
実装がまずく、例外が発生するようなことがあれば、変な挙動をする可能性は考えられますが、どういったときにどうなるかということを網羅的に知っている人は少数です。
再現コードを示し、協力を募った方が解決が早いと思われます。

# 単純にあるプロパティを非表示にしたいだけなら、そのプロパティをオーバーライドするか、new で定義しなおし、
# Browsable 属性で非表示に設定すれば楽ですけれども。

> 最後に、3点目が、カスタムコンポーネントはそもそもGUIを考慮せずに作成するものなのかという点です。
> 空白のコンポーネントをGUIで配置して、後はプログラムで操作するような感じがデフォルトで、
> あまりGUIで設定するところまでやらないものなのか、というのが気になっています。

GUI が「Windows フォームデザイナでのプロパティ」であるなら、一般的でしょう。
ボタンとか、チェックボックスとか、プロパティペインで設定するのが一般的ですし、自作のコントロールもそれに倣うのは何もおかしくありません。

引用返信 編集キー/
■58158 / inTopicNo.3)  Re[2]: カスタムコントロールの作成(.Net 4)
□投稿者/ めめ (25回)-(2011/03/28(Mon) 11:29:03)
No58127 (Azulean さん) に返信
> .NET 4 でありながら、.NET 2.0 が必要な状態になっているわけです。
> .NET 2.0 が入っていない状態で、.NET 4 Client Profile が入っているという環境もありうるので、これは解決になっていませんし、明確な理由なしに 2.0 のアセンブリを混ぜることはおすすめしません。(危険ではないと思いますが、一般解とはとても言えません)
> Type じゃなくて、string を指定するやり方なら、デザイン時のみ .NET 4 Extend が必要という形にできるかもしれませんね。
> (リンクされているスレッドで佐祐理さんが述べられていましたよね)

実行時はSystemDegisn.dllを必要とせず、Client Profileで動作させて、デザイン時のみにFull Frameworkを要求する、ということなので、文字列引数バージョンのEditorAttributeを使うということですよね。
Editorプロパティは、System.Designアセンブリを参照に追加する必要があるようなのですが、
その辺りの意味がよくわからないでいます。

private string _abc = string.Empty;

[Category("test"), Description("説明"), Editor("System.Windows.Forms.Design.FileNameEditor", "System.Drawing.Design.UITypeEditor")]
public string abc {
get { return _abc; }
set {_abc = value;}
}

このようなプロパティを作成してみたのですが、プロパティグリッドは普通の入力ボックスしか提供されませんでした。
ちなみに、System.Designはソリューションエクスプローラの参照設定に追加からは消しました。(.NET 2を利用していたので)
佐祐理さん、Azuleanさんの言う所の、System.Designアセンブリを参照の部分するという意味を根本的に勘違いしてるのでしょうか?

> どんなコードになっているのかわからないので、何とも言えません。
> 実装がまずく、例外が発生するようなことがあれば、変な挙動をする可能性は考えられますが、どういったときにどうなるかということを網羅的に知っている人は少数です。
> 再現コードを示し、協力を募った方が解決が早いと思われます。
> # 単純にあるプロパティを非表示にしたいだけなら、そのプロパティをオーバーライドするか、new で定義しなおし、
> # Browsable 属性で非表示に設定すれば楽ですけれども。

下のプログラムのようにして、[Designer(typeof())]みたいなアトリビュート?を利用して、デザイナーの定義をしていました。
上手く動くようなら、ひとまずBrowsableプロパティを使用してみようと思います。


[Designer(typeof(Line.LineDesigner))]
public partial class Line : Panel
{

// プロパティの定義
・・・

internal class LineDesigner : ControlDesigner
{
/// <summary>
/// デザイナで非表示にするプロパティを定義します.
/// </summary>
/// <param name="properties"></param>
protected override void PostFilterProperties(System.Collections.IDictionary properties)
{
properties.Remove("BackgroundImage");
properties.Remove("BackgroundImageLayout");
properties.Remove("BackColor");
properties.Remove("Font");
properties.Remove("Image");

properties.Remove("ErrorImage");
properties.Remove("ImageLocation");
properties.Remove("InitialImage");
properties.Remove("WaitOnLoad");

//base.PreFilterProperties(properties);
}
}

} // Lineクラスの閉じ


>>最後に、3点目が、カスタムコンポーネントはそもそもGUIを考慮せずに作成するものなのかという点です。
>>空白のコンポーネントをGUIで配置して、後はプログラムで操作するような感じがデフォルトで、
>>あまりGUIで設定するところまでやらないものなのか、というのが気になっています。
> GUI が「Windows フォームデザイナでのプロパティ」であるなら、一般的でしょう。
> ボタンとか、チェックボックスとか、プロパティペインで設定するのが一般的ですし、自作のコントロールもそれに倣うのは何もおかしくありません。

ありがとうございます。やはり、デザイナを利用するのは間違いではないのですね。
カスタムコントロールは.NET 4Clientのせいなのかもしれないですが、思ったより難しいですね。


参照
http://dobon.net/vb/dotnet/control/propertygrid.html
・「ファイルを開く」ダイアログを表示してファイルを選択できるようにする の辺り


引用返信 編集キー/
■58204 / inTopicNo.4)  Re[3]: カスタムコントロールの作成(.Net 4)
□投稿者/ Azulean (718回)-(2011/03/28(Mon) 23:09:00)
No58158 (めめ さん) に返信
> [Category("test"), Description("説明"), Editor("System.Windows.Forms.Design.FileNameEditor", "System.Drawing.Design.UITypeEditor")]

EditorAttribute クラスのコンストラクターをお読みになられていますか?
少なくとも、名前空間とクラス名だけだと、どのアセンブリにあるかわかりませんよね。
アセンブリを明示する部分が必要です。

http://msdn.microsoft.com/ja-jp/library/ka502ex0.aspx

たとえば、Google で「EditorAttribute」と検索すると、佐祐理さんが記述されているスレッドを見つけることができると思います。
http://www.google.co.jp/search?hl=ja&safe=off&biw=1138&bih=769&q=editorattribute+system.design&btnG=%E6%A4%9C%E7%B4%A2&aq=f&aqi=&aql=&oq=
http://social.msdn.microsoft.com/Forums/ja-JP/vwdexpressja/thread/6d7a9ff3-49a1-4019-b2cc-e13cb14f3e37/


# 2 点目は手元で今ビルドできる状態じゃないのでスキップします。
# どなたかのフォローに期待。
引用返信 編集キー/
■58256 / inTopicNo.5)  Re[4]: カスタムコントロールの作成(.Net 4)
□投稿者/ Azulean (722回)-(2011/03/29(Tue) 23:00:16)
よそに移動したようなのでリンクします。

http://social.msdn.microsoft.com/Forums/ja-JP/vsgeneralja/thread/538f269e-9071-4afd-82ea-49e5ca431fe9

# 2 カ所で同時並行される際はできれば、相互にフォローしてください。
# 情報が分散することになります。
引用返信 編集キー/
■58275 / inTopicNo.6)  Re[5]: カスタムコントロールの作成(.Net 4)
□投稿者/ めめ (26回)-(2011/03/30(Wed) 13:48:01)
リンク入れて頂いていたのですね。ありがとうございます。
両掲示板で回答頂いたAzuleanさん、本当にありがとうございました!

まとめですが、.NET4のClientProfileでも、ちゃんとSystem.Designは使うことができました。
まだ、クライアント環境(ClientProfile)で動作するかチェック取れていませんが、とりあえず解決です。
サンプルを提示しておくと、次のようにしておくといいようです。

/// <summary>
/// ファイルを選択できるGUIのテスト。
/// </summary>
[Category("test"), Description("説明"), Editor("System.Windows.Forms.Design.FileNameEditor, System.Design", "System.Drawing.Design.UITypeEditor")]
public string abc
{
get;
set;
}

PublicKeyなど、細かく設定するやり方も書いてあるので参考までに。
(指定しなくても動作するみたいですが)

参考
http://social.msdn.microsoft.com/Forums/ja-JP/vsgeneralja/thread/538f269e-9071-4afd-82ea-49e5ca431fe9

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -