Я предлагаю использовать комбинацию событий TreeView.NodeMouseClick и TreeView.KeyUp ... событие click предоставит вам узел, по которому щелкнули, посредством аргументов события, и с помощью keyup вы можете использовать текущий выбранный узел. Следуйте примеру ниже ...
//This is basic - you may need to modify logically to fit your needs
void ManageTreeChecked(TreeNode node)
{
foreach(TreeNode n in node.Nodes)
{
n.Checked = node.Checked;
}
}
private void convTreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
ManageTreeChecked(e.Node);
}
private void convTreeView_KeyUp(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Space)
{
ManageTreeChecked(convTreeView.SelectedNode);
}
}
Используя узел, заданный для каждого события, вы теперь можете циклически проходить через коллекцию узлов на этом узле и изменять ее, чтобы проверять / снимать флажок, учитывая статус проверенного состояния узла, с которым вы действовали.
Вы даже можете получить достаточно фантазии, чтобы снять отметку с родительского узла, когда все дочерние узлы сняты. Если вы хотите использовать три состояния с тремя состояниями (Все проверено, Некоторые проверены и Ни один не проверен), вам нужно создать его или найти созданный.
Наслаждайтесь, удачи.