第二个问题可以这样解决:
在treeview的afterchecked事件中添加如下代码
try
{
    foreach(TreeNode sNode in treeView.Nodes)
    {
        if (sNode.Checked  && sNode.Nodes.Count>0 )
        {
            foreach(TreeNode vNode in sNode.Nodes) if(!vNode.Checked) vNode.Checked = true;
        }
    }
}
catch(Exception Ex)
{
    MessageBox.Show(Ex.Message);
}