C++->C#の違いの覚書12
- TreeViewコントロール:Nodeプロパティから開くTreeNodeエディタとかのおかげで、えらい楽になった
- ShowLinesプロパティ:ノード間に線を表示するか
- ShowPlusMinusプロパティ:+−の記号を入れるか
- ShowRootLinesプロパティ:ルートノード間を線で繋ぐかどうか
- ExpandAll();Collapse()はツリー全体に作用するので、特定のブランチだけに作用させるなら
該ブランチのノードのメソッドを実行
TreeNode tn = tv.xxx.SelectedNode; if( tn ){ tn.ExpandAll(); } - ショートカットメニューの作り方を忘れていたので再度書く(詳しくも書いていなかったし)
//初期化時
EventHandler event1Handler = new EventHandler( onEvent1 );
EventHandler event2Handler = new EventHandler( onEvent2 );
ContextMenu cmenu = new ContextMenu();
MenuItem eve1 = new MenuItem("eve1(&e))", event1Handler );
MenuItem eve2 = new MenuItem("eve2(&f))", event2Handler );
MenuItem[] menuAR = new MenuItem[]{ eve1, eve2 };cmenu.ContextMenu.MenuItems.AddRange( menuAR );
xxx.ContextMenu = cmenu;//どのコントロールに紐付くかはこの時点まで不要
:
//イベント側
private void onEvent1( object sendar, System.EventArgs e ){
}
private void onEvent2( object sendar, System.EventArgs e ){
}
- TreeViewコントロールに動的に項目を追加する度に、コントロールは再描画される
これでは効率が悪いのでブロック単位で項目追加を行う
xxx.BeginUpdate();で更新を止めて項目を追加し終わったらxxx.EndUpdate()で更新を開始する- SelectやCollapse、及びExpandAllによるイベントはBeginとAfterとで夫々存在する
- stringクラスのメソッドにStartsWithというのがあって、例えばstring xxx ="yyxxzz"とかでhxxx.StartsWith("yy")
とした場合に該当パラメータが先頭から一致していればtrue,でなければfalseを返す機能を有する - 別件ではあるが、RegistryKeyクラスではWindowsレジストリのキーレベルノードを操作するのに使える(using Microsoft.Win32)
- ツリー全体を前もって作成すると時間がかかる場合があるので、BeforeExpandイベントを用いて随時ツリーを作成するのがよい
- ListViewコントロールはエクスプローラで使用されている"小さいアイコン"、"大きいアイコン"、"一覧"、及び詳細のビューをサポート
- 小さいアイコンはSmallImageListプロパティに、大きいアイコンはLargeImageListプロパティに指定するが,
画像からImageListオブジェクトを作成する際には、すべてのアイコン画像を一つの画像ストリップに保存する
以下の方法を用いると速い
- 小さいアイコンはSmallImageListプロパティに、大きいアイコンはLargeImageListプロパティに指定するが,
ListView lvDrives = new ListView();
lvDrives.LargeImageList = new ImageList();
Size sizeImages = new Size(32, 32);
lvDrives.LargeImageList.ImageSize = sizeImages;Bitmap icoLarge = new Bitmap( GetType(), "LvIconsLarge.bmp" );
icoLarge.MakeTransparent( Color.FromArgb(0xff, 0x00, 0xff) );
lvDrives.LargeImageList.Images.AddStrip( icoLarge );
-
- ListViewコントロールに項目を読み込むコードは以下の通り
ListViewItem lvi = new ListViewItem();
//↑ImageIndexやTextプロパティを指定できるコンストラクタもある
lvi.ImageIndex = 1;
lvi.Text = "ドライブ C;\\";
lvDrives.Items.Add( lvi );
-
- Viewを切り替える際にはlvDrives.View = View(.SmallIcon|,LargeIcon|,List|.Detail);のように
Viewプロパティを操作すればよい - ImageIndexプロパティを指定していない場合、一覧ビューではテキストのみが表示される
- 詳細ビューを使用するには、表示する列を定義する必要があり、以下のようなコードで行う
- lvDrives.Columns.Add("ドライブ", 100, HorizontalAlignment.Left);
- lvDrives.Columns.Add("種類", 150, HorizontalAlignment.Center);
- ListViewコントロールにおける項目の選択と解除により発生するイベントはSelectedIndexChanged
どの項目が選択されたかは自力でSelectedItemsコレクションより取得する
- Viewを切り替える際にはlvDrives.View = View(.SmallIcon|,LargeIcon|,List|.Detail);のように
private void OnxxxSelItemChanged( object sender, System.EventArgs e ){
string strChoise = "";
foreach( ListViewItem lvi in lv.SelectedItems ){
strChoise += " " + lvi.Text;
}
}
-
- 上記の例の場合、もしMultiSelectプロパティをtrueにしている場合、選択項目が複数取得される
→複数選択されているかは、SelectedItems.Countが0より大きいか否かで判断できる - SelectedIndexChanged同様にItemActivateイベントでも同様の処理を行えるが、ItemActivationプロパティにより
そのタイミングを調整することができる(OneClick, Standard, TwoClick)
- 上記の例の場合、もしMultiSelectプロパティをtrueにしている場合、選択項目が複数取得される