TreeViewのTag情報取得

このQ&Aのポイント
  • VB.NET2003を使用してCheckBox付のTreeViewを作成し、階層構造で人名とメールアドレスをセットした場合、特定の人のメールアドレスのみを取得する方法を教えてください。
  • TreeViewを使った階層構造で人名とメールアドレスを設定し、特定の人のメールアドレスのみを取得する方法をVB.NET2003を使用して教えてください。
  • VB.NET2003でCheckBox付きのTreeViewを作成し、階層構造で人名とメールアドレスを設定しました。特定の人のメールアドレスのみを取得する方法を教えてください。
回答を見る
  • ベストアンサー

TreeViewのTag情報取得

VB.NET2003 を使用して、 CheckBox付のTreeViewを作成しました。 階層は3階層用意して、最下層のTextに人名・Tagにメールアドレスをセットしました。 下記のサンプルの場合、チェックを入れたDさんのメールアドレスのみを 取得したいのですが、どのよう書けばよろしいでしょうか? ご教授いただけますよう、お願い致します。 TreeViewイメージ □本部  □総務課   □Aさん   □Bさん  □人事課   □Cさん   ■Dさん   □Eさん □営業  □東京   □Fさん   □Gさん TreeView作成コード Dim parentrow As DataRow Dim ParentTable As DataTable For Each parentrow In ds.Tables("A").Rows Dim parentnode As TreeNode parentnode = New TreeNode(parentrow.Item("SHOZOKU").ToString) treeView1.Nodes.Add(parentnode) ''''child''''' Dim childrow As DataRow Dim childnode As TreeNode childnode = New TreeNode For Each childrow In parentrow.GetChildRows("A") childnode = parentnode.Nodes.Add(childrow("BUSHO_NAME").ToString) ''''child2'''' Dim childrow2 As DataRow Dim childnode2 As TreeNode childnode2 = New TreeNode For Each childrow2 In childrow.GetChildRows("B") childnode2 = childnode.Nodes.Add(childrow2("NAME").ToString) childnode2.Tag = childrow2("MAIL").ToString Next childrow2 '''''''''''''''''''''''' Next childrow ''''''''''''''' Next parentrow treeView1.CheckBoxes = True

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

チェックされたのをいつ所得したいのでしょう? チェックされた時点でいいのであれば TreeViewのAfterChekイベントで dim nd as TreeNode nd = e.Node if nd.Checked then   MsgBox(nd.Tag) end if 別のイベント たとえば別ボタンのClick時点なら dim ndParent, ndChaild1, ndChaild2 as TreeNode dim sb as new System.Text.StringBuilder for each ndParent in TreeView1.Nodes   for each ndChild1 in ndParent.Nodes     for each ndchild2 in ndChild1.Nodes       if ndChild2.Chkeced then         if sb.Length <> 0 then           sb.Append( vbCrLf )         end if         sb.Append( ndChild2.Tag )       end if     next ' ndChild2   next '   ndChild1 next '     ndParent MsgBox(sb.ToString) といった具合になるかと

precious84
質問者

お礼

完璧なご回答有り難うございます! すぐに解決致しました。 非常に参考になりました。

precious84
質問者

補足

教えて頂いた通り、 別のボタンクリック時にデータ取得したいと考えております。 上記内容でまずは試したいと思います。 有り難うございます。

関連するQ&A

  • TreeViewに重複する値をセット

    VB2005Expressで開発しています。 TreeViewにデータテーブルの値をセットして表示しています。 セットする値に重複する値がある場合、ツリーの構造が崩れてしまいます。左図のようにしたいのですが、右図のようになってしまいます。 あ あ |-い |-い | | | | | -う | -う お | -え |-い お | | | -え ツリーの値に非表示のキーを持たせる等、何か対応法をご存知の方が いらっしゃいましたら教えて下さい。下記がPGMです。 '処理内容:TreeViewにデータテーブルの値をセット Private Function fncTreeViewSet() As Boolean Dim dTbl As DataTable Dim Node As TreeNode Dim intMenuNo As Integer Dim strMenuName1 As String Dim strMenuName2 As String Dim strMenuName3 As String Dim strMenuName4 As String Dim strMenuName5 As String Dim i As Integer Node = TreeView1.SelectedNode dTbl = dsDataSet.Tables("Mメニュー") For i = 0 To dTbl.Rows.Count() - 1 intMenuNo = 0 strMenuName1 = "" strMenuName2 = "" strMenuName3 = "" strMenuName4 = "" strMenuName5 = "" strMenuName1 = Trim$(dTbl.Rows(i)("階層1")) intMenuNo = dTbl.Rows(i)("工程番号") strMenuName2 = Trim$(dTbl.Rows(i)("階層2").ToString) strMenuName3 = Trim$(dTbl.Rows(i)("階層3").ToString) strMenuName4 = Trim$(dTbl.Rows(i)("階層4").ToString) strMenuName5 = Trim$(dTbl.Rows(i)("階層5").ToString) If strMenuName1 = "" Then Else If strMenuName2 = "" Then TreeView1.Nodes.Add(strMenuName1) '階層1をセット Else If strMenuName3 = "" Then fncSerchNode(strMenuName1) TreeView1.SelectedNode.Nodes.Add(strMenuName2) '階層2をセット Else If strMenuName4 = "" Then fncSerchNode(strMenuName2) TreeView1.SelectedNode.Nodes.Add(strMenuName3) '階層3をセット Else If strMenuName5 = "" Then fncSerchNode(strMenuName3) TreeView1.SelectedNode.Nodes.Add(strMenuName4) '階層4をセット Else fncSerchNode(strMenuName4) TreeView1.SelectedNode.Nodes.Add(strMenuName5) End If End If End If End If End If Next TreeView1.SelectedNode = Nothing End Function '処理内容:指定ノード選択 Private Function fncSerchNode(ByVal strMenuName As String) As Boolean Dim Node As TreeNode For Each Node In fncGetAllNodes(TreeView1.Nodes) If Node.Text = strMenuName Then TreeView1.SelectedNode = Node Exit For End If Next End Function '処理内容:子ノードも含んだすべてのノードを取得 Private Function fncGetAllNodes(ByVal Nodes As TreeNodeCollection) As ArrayList Dim Ar As New ArrayList Dim Node As TreeNode For Each Node In Nodes Ar.Add(Node) If Node.GetNodeCount(False) > 0 Then Ar.AddRange(fncGetAllNodes(Node.Nodes)) End If Next Return Ar End Function

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

  • vbでDataTableの抽出コピー

    vbでDataTableの抽出コピー DataTableから条件抽出したデータで別のDataTableを作成したい ・DataTable1から条件抽出したデータで別のDataTableを作成したい ・データの件数が違うだけでヘッダーなどの内容は同じにしたい Dim DataTable1 As DataTable ' 既にテーブルデータが入っているとする Dim DataTable2 As DataTable ' これに一部のデータとヘッダーを複写 Dim DataRow1 As DataRow ' DataRowの一時領域1 Dim DataRow2 As DataRow ' DataRowの一時領域2 <試作1:NG DataRowの使いまわしがきかない> DataTable2 = DataTable1.Clone For Each DataRow1 In DataTable1.Select(条件, ソート) DataTable2.Rows.Add(DataRow1) Next DataRow1 <試作2:NG ワンクッションかましただけではダメ> DataTable2 = DataTable1.Clone For Each DataRow1 In DataTable1.Select(条件, ソート) DataRow2 = DataRow1 DataTable2.Rows.Add(DataRow2) Next DataRow1 もしかして、個別セット以外に道はないのでしょうか? DataTable2 = DataTable1.Clone For Each DataRow1 In DataTable1.Select(条件, ソート) DataRow2 = DataTable2.NewRow DataRow2("item1") = DataRow1("item1") DataRow2("item2") = DataRow1("item2") DataRow2("item3") = DataRow1("item3") DataRow2("item4") = DataRow1("item4") DataRow2("item5") = DataRow1("item5") DataRow2("item6") = DataRow1("item6") DataRow2("item7") = DataRow1("item7") DataRow2("item8") = DataRow1("item8") DataTable2.Rows.Add(DataRow2) Next DataRow1 何か良い方法はありませんか?

  • 実行画面が消えてしまう?

    WindowsXP、VB6.0でデレクトリをTreeViewに表示するプログラムです。 フォームにTreeViewコントロールとコマンドボタンを貼り付け、 下記のプログラムを実行します。 curFolder.Name に "System Volume Information" がでると エラーになり、それを回避するために "On Error Resume Next"をいれて EXEファイルを作り、実行するとフォームが消えてしまいます。 どなたか教えて下さい。 Private Sub Command1_Click() ' Microsoft Scripting Runtime を参照設定する。 Dim item1 As Node, FsoObj As New scripting.FileSystemObject Set item1 = TreeView1.Nodes.Add(, , , "c:") Call SearchFolder(FsoObj.GetFolder("c:\"), item1) End Sub Private Sub SearchFolder(NextFolder As scripting.Folder,               itemX As Node) On Error Resume Next Dim TreeItem As Node, curFolder As scripting.Folder For Each curFolder In NextFolder.SubFolders ' Debug.Print curFolder.Path Set TreeItem = TreeView1.Nodes.Add(itemX.Index,                tvwChild, , curFolder.Name) Call SearchFolder(curFolder, TreeItem) Next End Sub

  • .NETのTreeViewの項目が一つの場合の画面遷移

    .NETのTreeViewの項目が一つの場合の画面遷移がうまくできません。 'Dim Node As TreeNode 'Dim form2 As New あああ 'Node = TreeView2.SelectedNode 'Select Case Node.Text ' Case "あああ" ' form2.Show() ' Me.Hide() 'End Select とすると、他画面から、TreeViewを経由して遷移させたくても、TreeView内に一つしか選択要素がない場合の画面へは行かず、すぐ上のTreeView内にいくつもの選択要素がある画面へ飛んでしまいます。 単体で動かしたくても、TreeView内に選択項目が一つの場合は動きません。 どなたか、回避する方法をご存知の方お教えください

  • Oracle階層問合せよりツリーノードを作成

    Oracle階層問合せの結果よりVB.NETのTreeViewを作成する方法を教えてください。 ・階層問合せのサンプル SELECT LPAD(' ', 2*level-1)||SYS_CONNECT_BY_PATH(last_name, '/') "Path" FROM employees START WITH last_name = 'Kochhar' CONNECT BY PRIOR employee_id = manager_id; Path --------------------------------------------------------------- /Kochhar /Kochhar/Greenberg /Kochhar/Greenberg/Faviet /Kochhar/Greenberg/Chen /Kochhar/Greenberg/Sciarra /Kochhar/Greenberg/Urman /Kochhar/Greenberg/Popp /Kochhar/Whalen /Kochhar/Mavris /Kochhar/Baer /Kochhar/Higgins /Kochhar/Higgins/Gietz VB.NET作成途中 Dim LEVEL_prev As Integer = 0 Dim node_prev As New TreeNode("") Dim aryNODENO(16) As Integer While (reader.Read()) NODE_NO = reader.Item("NODE_NO") LEVEL = reader.Item("LEVEL") PATH = reader.Item("PATH") NAME = reader.Item("NAME") Dim i As Integer Dim node_cur As New TreeNode("") node_cur.Expanded = True node_cur.Text = strSITE_NAME If intNODE_NO = 1 Then ' 新規ノードを準備する TreeView2.Nodes.Add(node_cur) Else If intLEVEL_prev < intLEVEL Then ' 下位層へ移動の場合、新規ノードを準備する TreeView2.Nodes(aryNODENO(intLEVEL - 1) - 1).ChildNodes.Add(node_cur) ElseIf intLEVEL_prev = intLEVEL Then '前のノードと同一階層 ' 前のノードを上位階層へ追加 TreeView2.Nodes(aryNODENO(intLEVEL - 1) - 1).ChildNodes.Add(node_cur) ElseIf intLEVEL_prev > intLEVEL Then ' '' 上位層へ移動の場合 '' ' ノードを上位階層へ追加 TreeView2.Nodes(aryNODENO(intLEVEL - 1) - 1).ChildNodes.Add(node_cur) End If End If intLEVEL_prev = intLEVEL node_prev = node_cur End While     Me.TreeView2.Nodes(0).Expand() 以上

  • ASP.NET2.0 TreeView チェックボックス

    皆様、お世話になります。 長田と申します。 環境はASP.NET2.0です。 1.新規にWebフォームを作成して、その中にTreeViewとボタンを作成します。 2.TreeViewはチェックボックスを持つように設定。 3.ボタン押下時にTreeViewの中でチェックボックスを選択されているものを取得して、ラベルに表示。 ネットにてサンプルを見つけたのですが、C#なため解読できません。(泣く VB.NETでしたらどのようになりますでしょうか宜しければご教授頂きたく思ってます。 ご指導お願い致します。 TreeViewイメージ □大分類A  □中分類1   □小分類1   □小分類2   □小分類3  □中分類2   □小分類1   □小分類2   □小分類3 □大分類B  □中分類1   □小分類1 コード(※ツリービューを作る所は省略) //ボタン押下時 protected void Button1_Click(object sender, EventArgs e) {   System.Text.StringBuilder sb = new System.Text.StringBuilder();   //大分類   sb.Append(SelectNode(TV1.Nodes));   foreach (TreeNode tn in TV1.Nodes)   {     //中分類     sb.Append(SelectNode(tn.ChildNodes));     foreach (TreeNode tn2 in tn.ChildNodes)     {       //小分類       sb.Append(SelectNode(tn2.ChildNodes));     }   }   Label1.Text = sb.ToString(); } //ノードに日もづく子ノードで且つ選択されているものを取得 public static string SelectNode(TreeNodeCollection tnc) {   System.Text.StringBuilder sb = new System.Text.StringBuilder();   foreach (TreeNode tn in tnc)   {     if (tn.Checked)     {       sb.Append(tn.Text);     }   }   return sb.ToString(); }

  • VB2005 ツリービューに子ノードを追加

    VB2005 ExpressEditionにて開発しています。 フォームロード時にデータセットからツリービューにデータをセット しようとしています。 ルートノードには  Dim Node As TreeNode  Node = TreeView2.SelectedNode  TreeView2.Nodes.Add("追加したい名前") で追加できます。 子ノードを追加する時はどうしたらいいのでしょうか。 ご存知の方がいらっしゃいましたら教えて下さい。 よろしくお願いします。

  • VBAでgetElementByTagName

    VBAでIEを動かそうとしている初心者です。 For Each a In ie.Document.getElementByTagName("A") で実行時エラー'438':オブジェクトは、このプロパティまたはメソッドをサポートしていません となるのですがなぜでしょうか Dim ie As Object Set ie = CreateObject("InternetExplorer.Application") ie.Visible = True '画面へ移動する ie.Navigate "http://www.forest.impress.co.jp/" waitNavigation ie Dim a As Object Dim urls As New Collection For Each a In ie.Document.getElementByTagName("A") urls.Add a.href Next

  • Macアドレスの取得(ソースは書けたが不安です)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load '1番目の方法 Dim Objquery As New Management.ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration WHERE MACAddress is not null") Dim ObjCollection As Management.ManagementObjectCollection = Objquery.Get Dim Obj As Management.ManagementObject For Each Obj In ObjCollection If (CType(Obj("IPEnabled"), Boolean) = True) Then Label1.Text = Replace(Obj("MacAddress"), ":", "") End If Next '2番目の方法 Dim computerProperties As IPGlobalProperties = IPGlobalProperties.GetIPGlobalProperties() Dim nics As NetworkInterface() = NetworkInterface.GetAllNetworkInterfaces() Dim adapter As NetworkInterface For Each adapter In nics Label2.Text = adapter.GetPhysicalAddress().ToString() Exit For Next adapter End Sub いつもお世話になっております。 以上の2種類の方法のどちらかでMACアドレスを取得したいのですが、あいにく知識不足で、どちらの方がより高い確率で取得できるのでしょう。 ちなみにソースを見る限り、IPアドレスなどは複数持つことができるようです。かなりかなり不安です。 お願いいたします。

専門家に質問してみよう