【無料配信♪】Renta !全タテコミ作品第1話

TreeViewのノードを編集する際、例えば、ノード名の後ろ2文字は編集せない、といったことをやりたいと思っています。

TreeViewのノードにファイル名を表示させています。ノード名が変更されたら、その名前をローカルのファイル名に反映させるつもりです。しかし、ファイル名の後ろ2文字に特別な意味があり、この2文字をユーザに編集させない処理ができないか模索しています。

何かよい方法はないでしょうか?

開発環境
Visual Basic 2008
.NET FrameWord 2.0
Windows XP SP2

このQ&Aに関連する最新のQ&A

A 回答 (3件)

文字列から最後の2文字を抜くのは BeginEditメソッド呼ぶときの方がいいようです



何かのアクション条件下でBeginEditを使う前に

sLast = objNode.Text.SubString( objNode.Text.Length - 2 )
objNode.Text = objNodeText.SubString(0, objNode.Text.Length -2 )
objNode.BeginEdit()
といった具合にします
# objNodeが編集するノード、変数sLastは最後を覚えておくClassレベルの変数です

編集が終わったときの処理 TreeView1_AfterLabelEdit イベントで
if e.Label isnot nothing then
  TreeView1.LabelEdit = False
  e.Node.EndEdit( False )
  e.Node.Text = e.Label & sLast
  ' これが無いと ラベルの内容がイベント終了後にe.Labelに戻ってしまう
  e.CancelEdit = True
else
  ' これが無いと編集モードにならない …
  e.Node.BeginEdit()
end if
といった具合でよさそうです

BeforeLabelEdit側での処理は複数回呼ばれてしまうのでうまくないようです
ただ、編集中に他のノードを選択した際の動作を制御する必要があると思います
また、この実装の場合何も編集しなかった場合も動作がおかしくなるようです … 編集モードから抜けれない状況になります
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

教えて頂いたコードを自分でも試してみました。
加えて、以下のURLにサンプルがありました。

http://69.10.233.10:80/KB/tree/CustomizedLabelEd …

両方をコードを元に、無事、期待通りの動作をさせる
コードが作成できました。
ありがとうございました。

お礼日時:2008/05/18 17:53

ChangeイベントとかEditイベントとか起きないんでしたっけ?Text系の派生クラスなら起きそうな気がしますが。

そこでイベントをハンドルして表示するのを後ろ2文字以外にするとか、ちょっと使い勝手は悪くなりますが編集用のダイアログを出すとかするとできるかもしれません。
あまりTreeViewは使ったことがないのですみません。

今ググったらBeforeLabelEditというイベントが起きますね(VB6以前なのかな。書き方がVB6っぽい)これをハンドルすればいいと思います。
    • good
    • 0
この回答へのお礼

BeforeLabelEditイベントが発生したときに、TreeViewに2文字抜いた文字列が表示されるよう、試しています。ですが、まだ、うまくいきません。
ちなみに、以下の方法で駄目でした。もう少し試してみます。

//Loadイベントでノード"test"を作成
//BeforeLabelEditイベントプロシージャの中で、
//以下のコードを実行

Dim strTemp As String = ""
Dim intCnt As Integer = 0
mstrTemp = TreeView1.Nodes(0).Text
intCnt = mstrTemp.Length

For i As Integer = 0 To intCnt - 3
strTemp += mstrTemp.Chars(i) //strTempには"te"が保存される
Next

TreeView1.Nodes(0).Text = strTemp //ここで入力すればTreeView上
                 //では"te"と表示されると
                 //思ったが駄目だった

お礼日時:2008/05/11 21:31

制限はできないので後ろ2文字を取り出しておいて(VB.Rightかなんかで)あとで付け足すくらいが現実的なやり方ではないでしょうか

    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ちなみ、ノード名を編集する際、表示されるのは後ろ2文字を除いた文字列だけを表示することはできないでしょうか?
そうすれば、ユーザからみたら、自分は後ろ2文字以外を編集しているということもはっきり伝わるので、誤解の生まれないよい操作になるかと思っているのですが。どうでしょうか?

お礼日時:2008/05/11 18:50

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QTreeView の初期表示について

TreeView に『A』『B』『C』のノードがあるとします。
初期表示を『B』ノードを選択・展開した状態(子ノードあり)にしたいのですが、
方法がわかりません。
何かよい方法はないでしょうか?よろしくお願いします。
説明不足な点はすぐに補います。

Aベストアンサー

'ノードの追加
Call TreeView1.Nodes.Add(, , "a", "A")
Call TreeView1.Nodes.Add("a", tvwChild, "b", "B")
Call TreeView1.Nodes.Add("b", tvwChild, "c", "C")

'ノードの展開
TreeView1.Nodes("a").Expanded = True
TreeView1.Nodes("b").Expanded = True

'ノードの選択
TreeView1.Nodes("b").Selected = True

上のコードで知りたいことはあっていますか?

Qフルパスから最後のディレクトリ名を取得したい。

vb.netなのですが、例えば
c:\aaa\bbb\ccc\ddd\eee\fff.exe
というフルパスがあったとして、
eeeというディレクトリ名を取得したいのですが、
何か良い方法はないでしょうか。
それぞれのディレクトリ名の文字数や階層数は
決まっていないのですが、オススメの方法が
ありましたら、教えて頂けると助かります。

Aベストアンサー

MessageBox.Show(IO.Path.GetFileName(IO.Path.GetDirectoryName(myPath)))

IO.Path の GetDirectoryName でフォルダのフルパスを取得して、さらに IO.Path の GetFileName で最終フォルダ(またはファイル)の名前を取得。

QTreeViewの再表示のちらつきをなくす方法

お世話になっております。

VB2005でWinアプリ開発中です。

テキストボックスに条件を入力し、ボタンを押下すると、
TreeViewに該当データのノードを設定し、
ノードを展開した状態で表示する処理があります。

ノードが展開表示されている状態で、ボタンを押下し
新しい情報を再表示すると、
ノードが折りたたまれて展開されたというような動きが見えてしまいます。
SuspendLayout/ResumeLayoutを入れてみたのですが、変化無しでした。
ノードが展開された状態で、パッと再表示するには、
どのようにすればよいのでしょうか?

よろしくお願いします!

Aベストアンサー

VB2005は使ってないのでなんともいえませんが
VB6まで(?)の典型的な方法としては
その処理の開始前にいったんそのコントロールを
非表示にして処理後に表示しなおす方法を使いました。
(VB6でのVisibleのTureとFalse)

QC#でtreeviewの指定ノードを選択する

C#にて、
treeviewでの選択ノードを記憶しておき、
treeviewを一度更新(削除し作成)し、
記憶してあるノードを再び選択する。という動きをしたいです。

TreeNode tn = new TreeNode();
tn = treeView1.SelectedNode;

//ここでDB再読み込み→treeView再作成

treeView1.Focus();
treeView1.SelectedNode = tn;

としているのですが、TopNode選択状態になってしまい、
最初に選択していたNodeを選択してくれません。


どなたかご教授願います。
よろしくお願いいたします。

Aベストアンサー

TreeViewを再作成した時点で、ノードのインスタンスがすべて新しく作り変えられているので、再作成前のノードで選択させることはできません。

再作成前に選択ノードのフルパスを記憶しておいて、作成後にフルパスを辿って選択させることならできます。フルパスを辿るのは自力になるかと。記憶したフルパスをPathSeparatorでSplitしてルートから順に子ノードを探していく方法くらいしか思いつきませんが・・・。
ただ、同じ階層に同じテキストのノードがあると破たんします。

QTreeViewについて

いつも大変お世話になっております。福島です。

TreeViewのことで教えて頂きたいのですが・・・

社員登録で3階層(部・課・社員)のツリー構造をなす
TreeViewを作成しましたが、1社員の情報を変更したときに
状態を反映するためにTreeView全体を消去してから書き直しています。
(例えば)課や部を移動したとき
しかし表示する数が多くなってきた為に再構築に非常に時間が
かかってしまい実用的でなくなってしまいました。

あるノードの下だけ変更(削除)する方法はありますか?

今は、「treeView.Nodes.Clear」を使用して全体を削除して
再度ツリーを作成しています。

aNode(部)
bNode(課)
cNode(社員)

のようになっています。

宜しくお願い申し上げます。

Windows2000SP2 + VB6.0SP4

Aベストアンサー

サンプルです。
TreeViewとコマンドボタンが必要です。

NodesはNodeオブジェクトのコレクションです。
As Collection と言う宣言を使用したことがある人ならわかると思うのですが、未経験者であれば、これを機に覚えることをお勧めします。
Collectionは登録時にKeyを仕込むことができます。
サンプルで言うと
.Add "会社", tvwChild, "経理部", "経理部"
というのは
.追加 "親となる物のキー", 自分は子, "キー文字列", "TreeViewに表示するテキスト"
となります。そのキーは重複することの無いように登録をしなければいけません。
そうすることによりキーでNodesコレクションからNodeオブジェクトの情報を取得することができます。
それを指定してあげると、削除できます。
また、キー文字列を指定しないでも、TreeViewの表示順にIndex値を持ちますので、それを利用してもオブジェクトの指定ができます。

注意すべきはNodesコレクションに追加するときは、キーには数値を登録できないことです。
"1"とかは無理ですが、"1A1"などは可能です。

Option Explicit

Private Sub Command1_Click()
  Dim nodWork As Node
  Dim lngSts As Long
  
  With Me
    With .TreeView1
      Set nodWork = .SelectedItem
      If nodWork Is Nothing Then
        Call MsgBox("未選択なので、削除無効")
        Exit Sub
      End If
      
      lngSts = MsgBox("[" & nodWork.Text & "]を削除しますか?", vbOKCancel)
      If lngSts = vbCancel Then
        Exit Sub
      End If
      
      '選択中のノードを削除
      .Nodes.Remove nodWork.Key
      '下のような表現でもよい(キー文字列かIndex文字列を渡す)
      '.Nodes.Remove nodWork.Index
    End With
  End With
End Sub

Private Sub Form_Load()
  With Me
    With .TreeView1
      With .Nodes
        'NODEを追加
        'これについては説明不要とします。。。
        .Add , , "会社", "会社"
      
        .Add "会社", tvwChild, "経理部", "経理部"
        .Add "経理部", tvwChild, "財務課", "財務課"
        .Add "経理部", tvwChild, "購買課", "購買課"
        
        .Add "会社", tvwChild, "総務部", "総務部"
        .Add "総務部", tvwChild, "総務課", "総務課"
        .Add "総務部", tvwChild, "用務課", "用務課"
        
        .Add "会社", tvwChild, "営業部", "営業部"
        .Add "営業部", tvwChild, "法人営業課", "法人営業課"
        .Add "営業部", tvwChild, "お客様サービス課", "お客様サービス課"
      End With
      
      '経理部が初期表示で見えるようにする(同時に、並列の総務部や営業部などの部も見えるようになる)
      .Nodes("経理部").EnsureVisible
      
      '下のような表現でもよい(TreeView内において[経理部]は Index=2だから)
      '.Nodes(2).EnsureVisible
      
    End With
    .Command1.Caption = "削除"
  End With
End Sub

サンプルです。
TreeViewとコマンドボタンが必要です。

NodesはNodeオブジェクトのコレクションです。
As Collection と言う宣言を使用したことがある人ならわかると思うのですが、未経験者であれば、これを機に覚えることをお勧めします。
Collectionは登録時にKeyを仕込むことができます。
サンプルで言うと
.Add "会社", tvwChild, "経理部", "経理部"
というのは
.追加 "親となる物のキー", 自分は子, "キー文字列", "TreeViewに表示するテキスト"
となります。そのキーは重複することの無いように...続きを読む

Qツリービューの使い方が・・・

VBのカスタムコントロールはほとんどさわったことがないので、ぜんぜんわからないです。
初心者っぽい質問で申し訳ないのですが、プロセスとプロセスがもっているスレッドを、プロセスID&スレッドIDをキーにツリー構造を持たせたいのですが、ツリービューのツリーへのアクセスのしかたがわかりません。
MSDNライブラリが壊れているようで、ヘルプが出ないのです。
新しいMSDNライブラリ入れてから、トラブル続き。

TreeView1.Nodes.Add , , "キー", "値"
TreeView1.Nodes.Add , , "キー\サブキー", "値"

じゃなさそうみたいです。

かといってそれぞれのノードが小枝への参照をもっているわけでもないし、小枝を追加するメソッドをもっているわけでもないし。

単純に小枝への追加のしかたが知りたいだけなんですけど・・・。
だれか教えてください。

Aベストアンサー

>はい、その点はわかっております。
わかってくださったようでうれしいです。

tvwChild の上にカーソルがある状態で「F1キー」を押したら、MSDNに情報が出ませんか?
僕のMSDNは「ツリー ビュー (TreeView) コントロールの定数」というのが開きました。

>インターフェースを作るのが後回しになって、結局内部だけ作って、中途半端な状態で終わっちゃう
わかります。その気持ち。。。
よく僕もあります。

僕も内部のパーツから作ります。画面なんてどうにでもなるし、パーツを作りこんでいるうちに最初リストビューにしようと思っていたことが、ツリービューの方がいいかもと思えることもあるので、画面を最初から作るはめに・・・なんてことがないようにしたいですしね。

まぁ何にせよ、がんばってください。

QVB2005 TreeViewの任意ノード選択

お世話になっております。

VB2005でWinアプリを開発中です。
ルートノードは1つで、
そこから子、孫、ひ孫・・・と階段状になるTreeViewを作っています。

  L子
     L孫
        Lひ孫
            ・・・・

このようなツリーに対し、プログラムで任意のノードを選択状態にしたいのですが、
ノードの名称などで一発で指定する方法はありますでしょうか??
上の例で、「孫」を選択状態にしたい場合、
TreeView1.SelectedNode = TreeView1.Nodes(0).Nodes(0).Nodes(0)
と書けば、できることはできるのですが。
他にもっとよい方法があるはずと思うのですが、見つけられませんでした。

VB6.0なら、下記に方法があったのですが・・・
http://oshiete1.goo.ne.jp/qa732490.html

よろしくお願いします。

Aベストアンサー

参考URLです。
http://homepage1.nifty.com/rucio/main/dotnet/Samples/SmpleCnt.htm

QC# TreeView 効率良いノード追加の仕方

C# TreeViewについて質問させてください。
ノード(子ノード含む)を数万件以上登録する際に、効率の良い方法を教えて頂けないでしょうか?

実際のコードとは異なりますが、大まかに以下のような処理をメインスレッドで行っています。
class MyTreeNode : TreeNode{
  void AddNode(){
    BeginUpdate();
    SuspendLayout();
    foreach( var 親ノード情報 in 親ノード情報リスト ){
      TreeNode parentNode = new TreeNode( 親ノード名 );
      foreach( var 子ノード情報 in 子ノード情報リスト ){
        TreeNode childNode = new TreeNode( 子ノード名);
        parentNode.Nodes.Add( childNode );
      }
      this.Nodes.Add( parentNode );
    }
    ResumeLayout();
    EndUpdate();
  }
}
この方法ですと、かなり時間がかかってしまい、UIが固まったようになってしまいます。

(TreeViewに、子ノードの一斉展開機能が必要なので、親ノード展開時のイベントを拾って
 子ノードを追加する方法は上記と同じく遅くなってしまうのではと思っていますがどうなんでしょうか?)

C# TreeViewについて質問させてください。
ノード(子ノード含む)を数万件以上登録する際に、効率の良い方法を教えて頂けないでしょうか?

実際のコードとは異なりますが、大まかに以下のような処理をメインスレッドで行っています。
class MyTreeNode : TreeNode{
  void AddNode(){
    BeginUpdate();
    SuspendLayout();
    foreach( var 親ノード情報 in 親ノード情報リスト ){
      TreeNode parentNode = new TreeNode( 親ノード名 );
      foreach( var 子ノード情報 in ...続きを読む

Aベストアンサー

今試せる環境がないので半分くらい無責任発言なんですが、一応案として、何かの参考になれば。

・効率が良くなるかもしれない方法
 TreeNodeを配列化してAddRangeする(Addを使わず配列で渡す)
 ※配列はListではなくTreeNode[]でnew

・追加時間を短縮する方法
 System.Threading.Tasks.Parallelを使って並列実行する
 ぱっと見、1つの「親ノード情報」に対する子は予め決まってそうなので、「親ノード情報」単位で並列化が可能にみえます。ノード間で何かしら依存する場合はたぶん無理です。

・ノード追加処理を非同期化させるか、メッセージ処理をはさむ
 UIが固まるのは、処理が重いからというより、ウインドウが長時間メッセージを処理できなくなるからです。
 なので、たとえば何階層か展開する毎にメッセージ処理を挟めばUIが止まることはなくなります(処理中にウインドウが操作を受け付けるようになるので別の問題起き得ます)。

Qツリービューのノードをダブルクリックしたことを判断させるには

 VBにて、ツリービューのノードをダブルクリックしたときにこうする、というような処理をさせるにはそうすればいいんでしょうか。

 TreeView1_NodeClickというのはありますが、ダブルクリックに関してはDblClickだけしか存在せず、どのノードを選択したかを取得できません。

 どなたか、TreeView1_NodeClickのようにノードをダブルクリックした時に限り、そのノードを取得して処理をさせるというような方法を教えてください。

 よろしくお願いします。

Aベストアンサー

Private ClickedNode As MSComctlLib.Node

Private Sub TreeView1_DblClick()
MsgBox ClickedNode.Text + "がダブルクリックされました"
End Sub

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
Set ClickedNode = Node
End Sub

NodeClickイベントで、クリックされたノードをセットしておき、ダブルクリックイベントでそれを利用するというのはどうでしょう。


人気Q&Aランキング