- 題名: checkbox付きのTreeViewで選択された項目を取得したい
- 日時: 2011/09/05 10:53:17
- ID: 28986
- この記事の返信元:
- (なし)
- この記事への返信:
- [28989] Re[1]: checkbox付きのTreeViewで選択された項目を取得したい2011/09/05 15:55:50
- ツリーを表示
■No28986に返信(たけぞうさんの記事)
> TreeViewにはcheckboxを付けており、ツリー全体からチェックされている項目名を
> すべて取得してtextboxに表示させるという事をやりたいのですが、やり方がわかりません。
こういうことで良いのかな…。
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using System.Xml.Linq;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
XDocument doc;
TreeView treeView1 = new TreeView();
TextBox textBox1 = new TextBox() { Multiline = true, ScrollBars = ScrollBars.Both, Height = 100 };
public Form1()
{
doc = XDocument.Parse(
@"<root name='会社' ward=''>
<group name='日本' ward=''>
<group name='東京本社' ward='tokyo' section=''>
<group name='営業部' ward='tokyo' section='eigyo'>
<item name='営業1課' ward='tokyo' section='eigyo'/>
<item name='営業2課' ward='tokyo' section='eigyo'/>
<item name='営業3課' ward='tokyo' section='eigyo'/>
</group>
<group name='総務部' ward='' section=''>
<item name='総務1課' ward='tokyo' section='soumu'/>
<item name='総務2課' ward='tokyo' section='soumu'/>
<item name='総務3課' ward='tokyo' section='soumu'/>
</group>
</group>
</group>
</root>");
InitializeComponent();
this.Controls.Add(treeView1);
treeView1.Dock = DockStyle.Fill;
treeView1.CheckBoxes = true;
this.Controls.Add(textBox1);
textBox1.ReadOnly = true;
textBox1.Dock = DockStyle.Bottom;
treeView1.Nodes.Add(new TakezoNode(doc.Root));
treeView1.ExpandAll();
treeView1.AfterCheck += delegate(object sender, TreeViewEventArgs e)
{
textBox1.Clear();
Sample(treeView1.Nodes.OfType<TakezoNode>());
};
treeView1.AfterCheck += delegate(object sender, TreeViewEventArgs e)
{
foreach (TreeNode node in e.Node.Nodes)
{
node.Checked = e.Node.Checked;
}
};
}
void Sample(IEnumerable<TakezoNode> nodes)
{
foreach (var item in nodes)
{
if (item.Checked && item.Xml.Name == "item")
{
textBox1.AppendText(item.Xml.ToString() + "\r\n");
}
Sample(item.Nodes.OfType<TakezoNode>());
}
}
class TakezoNode : TreeNode
{
public readonly XElement Xml;
public TakezoNode(XElement element)
{
this.Xml = element;
this.Text = element.Attribute("name").Value;
this.ForeColor = (element.Name == "item") ? Color.Blue : Color.Brown;
foreach (var child in element.Elements())
{
this.Nodes.Add(new TakezoNode(child));
}
}
}
}
}
分類:[.NET]
C#2008でXML形式のデータを読み込ませてTreeView上に表示させています。
TreeViewにはcheckboxを付けており、ツリー全体からチェックされている項目名を
すべて取得してtextboxに表示させるという事をやりたいのですが、やり方がわかりません。foreach
※XMLデータの方は下記のような構造で、「チェックされているitemタグの項目」を抽出したいのです。(group タグ項目は必要ありません)
<root name=" 会社" ward="">
<group name=" 日本" ward="">
<group name=" 東京本社" ward="tokyo" section="">
<group name=" 営業部" ward="tokyo" section="eigyo">
<item name=" 営業1課" ward="tokyo" section="eigyo"/>
<item name=" 営業2課" ward="tokyo" section="eigyo"/>
<item name=" 営業3課" ward="tokyo" section="eigyo"/>
</group>
<group name=" 総務部" ward="" section="">
<item name=" 総務1課" ward="tokyo" section="soumu"/>
<item name=" 総務2課" ward="tokyo" section="soumu"/>
<item name=" 総務3課" ward="tokyo" section="soumu"/>
</group>
</group>
</group>
</root>