Хитрость заключается в создании соединения между узлами и элементами.
Давайте предположим, что вы можете использовать Tags
обоих ..
Здесь я заполняю два элемента управления:
private void button1_Click(object sender, EventArgs e)
{
listView1.Columns.Add("No");
listView1.View = View.Details;
for (int i = 0; i < 9; i++)
{
// keep a temporary reference of the new nodes/items..
ListViewItem lvi = listView1.Items.Add("Item " + i);
TreeNode tn = treeView1.Nodes.Add("Item " + i);
// ..and store them in the respective tags:
lvi.Tag = tn;
tn.Tag = lvi;
}
}
Теперь sych'ing их легко:
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
if (e.Node.Tag != null)
((ListViewItem)(e.Node.Tag)).Checked = e.Node.Checked;
}
private void listView1_ItemChecked(object sender, ItemCheckedEventArgs e)
{
if (e.Item.Tag != null)
((TreeNode)(e.Item.Tag)).Checked = e.Item.Checked;
}
Больше сложные правила, такие как проверка суб-узлов, должны быть определены сначала, а затем, как обычно, в дереве, вам придется написать рекурсивную функцию.