C#WindowsフォームベースのアプリケーションにCheckBoxを備えたTreeViewがあります。ユーザーは、ノードのチェックボックスをクリックしてアイテムを選択します。ユーザーがgetselectedlistボタンをクリックするたびに、選択したチェックボックスのノード名を取得したいのですが、どうすればよいですか?.
この問題から抜け出すために私を導いてください...
単純な再帰関数を使用できます。
List<String> CheckedNames( System.Windows.Forms.TreeNodeCollection theNodes)
{
List<String> aResult = new List<String>();
if ( theNodes != null )
{
foreach ( System.Windows.Forms.TreeNode aNode in theNodes )
{
if ( aNode.Checked )
{
aResult.Add( aNode.Text );
}
aResult.AddRange( CheckedNames( aNode.Nodes ) );
}
}
return aResult;
}
YourTreeView.Nodes
で使用するだけです
または、何かがチェックされるたびにTreeViewのすべてのノードを再帰的にループする代わりに、私のようにリストに数百または数千のアイテムがあり、チェックされるアイテムが20を超えない場合、コストがかかる可能性があります。
FullPath文字列のみが必要だったので、チェック/チェック解除後に文字列リストに追加/削除しますが、必要に応じて、TreeNodeのコレクションを同じ方法で使用することもできます。
public partial class Form1 : Form
{
List<String> CheckedNodes = new List<String>();
public Form1()
{
InitializeComponent();
}
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Node.Checked)
{
CheckedNodes.Add(e.Node.FullPath.ToString());
}
else
{
CheckedNodes.Remove(e.Node.FullPath.ToString());
}
}
}
//Uncomplicated, reliable method
List<int> _valueList = new List<int>();
private List<int> getCheckedNodes(TreeNodeCollection _parentNodeList)
{
foreach (TreeNode item in _parentNodeList)
{
if (item.Checked)
{
_valueList.Add(Convert.ToInt32(item.Value));
}
if (item.ChildNodes.Count > 0)
{
//.NET does not forget where it stayed.
getCheckedNodes(item.ChildNodes);
}
}
return _valueList;
}
ボタンクリックイベントでは、 http://msdn.Microsoft.com/en-us/library/wwc698z7.aspx で説明されているように、ツリー全体を反復処理できます。次に、TreeNodeごとに、チェックボックスがオンになっているかどうかを確認できます。チェックボックスがオンになっている場合は、その名前をリストに追加できます。