プロが教えるわが家の防犯対策術!

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

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

よろしくお願いします。

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

A 回答 (2件)

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

できました!
ご紹介いただいたサイトは何度か参考にさせていただいて
いたのですが、この項目を見逃していたようです・・・。

本当にありがとうございました!

お礼日時:2006/11/17 13:26

書き込み足らずで投稿ボタンを押してしまいました。

補足しときます。
左側メニューから、
  ・ツリービュー (Windows.Forms.TreeView)
   ノードを選択する
を参照して下さい
    • good
    • 0

この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

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

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してルートから順に子ノードを探していく方法くらいしか思いつきませんが・・・。
ただ、同じ階層に同じテキストのノードがあると破たんします。

Qツリービューで、エクスプローラー風にフォルダを辿る

ツリービューで、エクスプローラー風にフォルダをたどるプログラムサンプル例を知りたいのですが、ご存知のかたはいらっしゃいませんでしょうか。
Visual Basic 2010 Express Edition を利用しています。

参考書を何冊も読みましたが、ドライブやフォルダ情報を得ても、どうやってそれらをノードにしたら良いのか、よくわかりませんでした。

VisualBasic中学校のサンプルではややこしすぎる上、エラーが発生しました。
よろしくお願いいたいします。

Aベストアンサー

どこまで「真面目に」やりたいかにもよりますが……。

本当に真面目にやるなら,フォルダはディレクトリではないため,
MSDN) SHGetFolderLocation function
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762180.aspx
を起点に
MSDN) SHCreateItemFromIDList function
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762133.aspx
でIShellItemを得て,それからフォルダやファイル等を列挙していくか,
ツリービューを諦めて
MSDN) INameSpaceTreeControl interface
http://msdn.microsoft.com/en-us/library/windows/desktop/bb761630.aspx
を使うか,となります。
# 私は後者をC#でやろうとしてP/Invokeの宣言だけで諦めました……。


Visual Basic 中学校のサンプルというのは,
Site) VB サンプル集 - VB2010, VB2008, VB2005, VB.NET2003, VB.NET2002
http://homepage1.nifty.com/rucio/main/dotnet/Samples/SmpleCnt.htm
にある,
Site) VB フォルダツリー
http://homepage1.nifty.com/rucio/main/dotnet/Samples/Sample081FolderTree.htm
のことでしょうか。
非常にコンパクトなサンプルだと思いますが。
・何が分からなかったのでしょうか
・エラーとはどういうエラーでしょうか (例外であれば,その型とエラーメッセージ)
# Visual Basic 中学校には質問用の掲示板があるのですけれどね……。

どこまで「真面目に」やりたいかにもよりますが……。

本当に真面目にやるなら,フォルダはディレクトリではないため,
MSDN) SHGetFolderLocation function
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762180.aspx
を起点に
MSDN) SHCreateItemFromIDList function
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762133.aspx
でIShellItemを得て,それからフォルダやファイル等を列挙していくか,
ツリービューを諦めて
MSDN) INameSpaceTreeControl interface
http://msdn.micros...続きを読む

QTreeViewを反転表示したままTextBoxにカーソル

VB2005 Expressで開発をしています。

TreeViewでノードを選択して、その値をTextBoxに表示しようと
思っています。
そこで、選択したノードを反転表示したままTextBoxにカーソル
をセットすることは可能なのでしょうか。

フォーカスを当てた上体で反転されるので無理な気はするのですが、
ご存知の方がいらっしゃいましたら教えて下さい。

よろしくお願いします。

Aベストアンサー

TreeViewのHideSelectionをfalseに設定すれば フォーカスが外れても選択状態のままの表示になりますよ

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が止まることはなくなります(処理中にウインドウが操作を受け付けるようになるので別の問題起き得ます)。

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

QTreeViewで複数ノードの選択は可能ですか?

VisualBasic2005でwindowsアプリの開発をしています。

今回希望として、複数のノードを一度にドラッグするというのがあるのですが、
TreeViewで複数ノードの選択は可能なのでしょうか?
そして、もし可能な場合、それらを一気にドラッグということは可能でしょうか?
ドロップ先では、ドラッグ中のノードのtextが取れればよいです。

よろしくお願いします。

Aベストアンサー

TreeViewをカスタマイズすれば出来ます。

C#のサンプルがありますので参考にしてみてはどうでしょうか
http://www.codeproject.com/cs/miscctrl/mwcontrols.asp

QVB.NET DataGridView 縦スクロールバーを常に表示

VB.netについてなのですが、
DataGridViewの縦スクロールバーを常に表示したいです。
データ数によってスクロールバーが表示されたり非表示になったりしていますが、常に表示することは可能でしょうか。教えてください。

環境:
Visualstudio2005
windows XP
よろしくお願いします。

Aベストアンサー

Private vsBar As VScrollBar
Private Sub DataGridViewScrollBar_Load(ByVal sender As Object, ByVal e As EventArgs)
Me.tESTTableAdapter.Fill(Me.testdbDataSet.TEST)

For Each c As Control In dataGridView1.Controls
If TypeOf c Is VScrollBar Then
vsBar = DirectCast(c, VScrollBar)

AddHandler vsBar.VisibleChanged, AddressOf vsBar_VisibleChanged
End If
Next
End Sub
Private Sub vsBar_VisibleChanged(ByVal sender As Object, ByVal e As EventArgs)
If Not vsBar.Visible Then
'縦クロースバーを常に表示する。
Dim borderWidth As Integer = 2

vsBar.Location = New Point(Me.dataGridView1.ClientRectangle.Width - vsBar.Width, 0)
vsBar.Size = New Size(vsBar.Width, Me.dataGridView1.ClientRectangle.Height - borderWidth)
vsBar.Show()
End If
End Sub

ミスしてたらごめんなさい・・・orz

Private vsBar As VScrollBar
Private Sub DataGridViewScrollBar_Load(ByVal sender As Object, ByVal e As EventArgs)
Me.tESTTableAdapter.Fill(Me.testdbDataSet.TEST)

For Each c As Control In dataGridView1.Controls
If TypeOf c Is VScrollBar Then
vsBar = DirectCast(c, VScrollBar)

AddHandler vsBar.VisibleChanged, AddressOf vsBar_VisibleChanged
End If
Next
End Sub
Private Sub vsBar_VisibleChanged(ByVal ...続きを読む

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

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&Aを見た人がよく見るQ&A

人気Q&Aランキング