ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog

About Making Materials on UE, Making Tools with C#, etc

C# TreeViewのノードに対応した文字列をTextBoxに表示する

TreeViewとTextBoxを連動させてツリー構造のテキストエディタを作成中ですが、TreeViewのノードごとにTextBox.Textの内容を記憶させておかないといけません。

その方法についてメモっておきます。ちなみに対応後はこんな感じ。

f:id:moko_03_25:20190608162656g:plain

まず、テキストの内容などを保持しておくためのデータ保持クラスを用意します。

そしてフィールドなりプロパティで下記のような情報を保持する箱を用意します。

・ノードのラベル名 string型
・TextBoxの内容 string型
・キャレットの位置 int型

クラスの内容はこれだけでOKです。

次にMainFormの方に、新しくノードを追加する関数を用意します。

その際にTreeViewのノードのTagに対して、先ほど作成したデータ保持クラスのインスタンスを代入すれば、追加したノードごとにインスタンスを保持してくれます。

ここにテキストの内容を保存したり逆に表示したりすれば良い訳です。

こちらの記事が参考になるかと思います。

問題はノードの選択を変えた時にどのイベントを利用するかですが「BeforSelect」と「AfterSelect」を利用すれば良いようです。

・TreeView1_BeforeSelect イベント
 選択中のノードのTagからデータ保持クラスのインスタンスを取得
 TextBox.Textをインスタンスのフィールドやプロパティに代入

・TreeView1_AfterSelect イベント
 選択中のノードのTagからデータ保持クラスのインスタンスを取得
 インスタンスのフィールドやプロパティからTextBox.Textに代入

これでOKです。

ただし注意点がいくつかあります。

・新規ノード追加時に「BeforSelect」と「AfterSelect」が邪魔
 こちらは新規ノード追加時のフラグを用意しておき‥
 それぞれのイベントは新規ノード追加時には実行しないようにすればOKです。

・ルートノードを削除したような際に例外が発生する
 削除時は削除した直後の内容をデータ保持クラスに保存しようとしたりするので‥
 選択中のノードが null なら保存処理を実行しないようにします。

以上のような対処でひとまずうまく動作しました。