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

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

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

Re[4]: コンテキストメニュー2階層目のマージン消去


(過去ログ 139 を表示中)

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

■81614 / inTopicNo.1)  コンテキストメニュー2階層目のマージン消去
  
□投稿者/ ちぬ次郎 (1回)-(2016/10/20(Thu) 04:11:52)

分類:[C#] 

VS2010 にて開発中で、C# は初心者に毛が生えた程度です。

以下の様にしてコンテキストメニューの2階層目までを作成しました。
1階層目は ContextMenuStrip の ShowCheckMargin、ShowImageMargin からマージンの消去が可能ですが、2階層目のマージンが消去できません。

ContextMenuStrip cms = new ContextMenuStrip();
ToolStripMenuItem tsmi1 = new ToolStripMenuItem();
ToolStripMenuItem tsmi21 = new ToolStripMenuItem();
ToolStripMenuItem tsmi22 = new ToolStripMenuItem();

cms.Items.Add(tsmi1);

tsmi1.DropDownItems.Add(tsmi21);
tsmi1.DropDownItems.Add(tsmi22);

2階層目の ToolStripMenuItem 群を ContextMenuStrip にどうしてもキャストできず、何か思い違いをしているのか、そもそもメニューの作成方法が誤っているのか分かりません。
よろしくお願いします。
引用返信 編集キー/
■81615 / inTopicNo.2)  Re[1]: コンテキストメニュー2階層目のマージン消去
□投稿者/ Hongliang (463回)-(2016/10/20(Thu) 09:09:46)
こんな感じで
var menu = (ToolStripDropDownMenu)tsmi1.DropDown;
menu.ShowImageMargin = false;

引用返信 編集キー/
■81620 / inTopicNo.3)  Re[2]: コンテキストメニュー2階層目のマージン消去
□投稿者/ ちぬ次郎 (2回)-(2016/10/20(Thu) 10:38:38)
No81615 (Hongliang さん) に返信

早速のアドバイス、ありがとうございました。思った通りのメニューが出来ました!

しかし、(ToolStripDropDownMenu)tsmi1.DropDown 単独ではプロパティの設定が不可なのに、
var 変数に代入しただけで ShowImageMargin が使えるというのは何とも不思議と言うかファジーですね。

また質問する事があると思いますが、よろしくお願いします。
解決済み
引用返信 編集キー/
■81623 / inTopicNo.4)  Re[3]: コンテキストメニュー2階層目のマージン消去
□投稿者/ Hongliang (464回)-(2016/10/20(Thu) 11:02:40)
> var 変数に代入しただけで ShowImageMargin が使えるというのは何とも不思議と言うかファジーですね。

うん? ちょっと誤解があるような。
varは、単に型名を書くのを略しただけで、コードの意味としては
ToolStripDropDownMenu menu = (ToolStripDropDownMenu)tsmi1.DropDown;
とまったく変わりません。

> しかし、(ToolStripDropDownMenu)tsmi1.DropDown 単独ではプロパティの設定が不可なのに、

これは、単に演算子類の優先度の問題ではないでしょうか。
ToolStripMenuItemのDropDownプロパティはToolStripDropDown型を返しますが、ToolStripDropDown型はメニューに限らないドロップダウン全般を表すので、ShowImageMarginのようなプロパティはもっていません。
なのでキャストが必要になるわけですが。
(SomeType)variable.Property
(SomeType)variable.Property.Member
と比較すればわかりやすいかも知れませんが、キャスト演算子 () はメンバアクセス演算子 . よりも優先順位が低くなっています。
ですので、
(SomeType)variable.Propertyは、variableが持っているPropertyの値をSomeTypeにキャストする、ですし、
(SomeType)variable.Property.Memberは、variableが持っているPropertyの値が持っているMemberの値をSomeTypeにキャストする、です。
「variableが持っているPropertyの値をSomeTypeにキャストし、SomeType型が持っているMemberの値を取り出す」は、括弧によって優先順位を変更し
((SomeType)variable.Property).Member
と記述する必要があります。
引用返信 編集キー/
■81628 / inTopicNo.5)  Re[4]: コンテキストメニュー2階層目のマージン消去
□投稿者/ ちぬ次郎 (3回)-(2016/10/20(Thu) 14:46:49)
No81623 (Hongliang さん) に返信

なるほど。確かにご説明の通り、

((ToolStripDropDownMenu)tsmi1.DropDown).ShowImageMargin

だとOKな訳ですね。
どのプロパティを何の型でキャストするのか全く分かりませんでしたが、スッキリしました。
重ね重ね、ありがとうございました。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -