C# 防止用户更改TreeView中的复选框

C# 防止用户更改TreeView中的复选框,c#,.net,winforms,checkbox,treeview,C#,.net,Winforms,Checkbox,Treeview,我有一个winforms树视图,其中添加了节点,并根据数据库值以编程方式检查状态集。我试图阻止用户更改支票状态,但遇到了问题。我不确定触发什么事件来保持检查状态不变 下面是我的代码: private void BuildRolesTree(int ParentID, TreeNode pNode, DataSet SourceDS) { DataView dvwData = new DataView(SourceDS.Tables[0]);

我有一个winforms树视图,其中添加了节点,并根据数据库值以编程方式检查状态集。我试图阻止用户更改支票状态,但遇到了问题。我不确定触发什么事件来保持检查状态不变

下面是我的代码:

private void BuildRolesTree(int ParentID, TreeNode pNode, DataSet SourceDS)
    {
        
        DataView dvwData = new DataView(SourceDS.Tables[0]);
        dvwData.RowFilter = "[parent_id] = " + ParentID;
        if (this.InvokeRequired)
        {
            BuildReportTreeDelegate d = new BuildReportTreeDelegate(BuildRolesTree);
            this.Invoke(d, new object[] { ParentID, pNode, SourceDS });
        }
        else
        {
            foreach (DataRowView Row in dvwData)
            {
                TreeNode zNode;

                if (pNode == null)
                    zNode = tv_Permissions.Nodes.Add(Row["node_id"].ToString(), Row["display_access_description"].ToString().Trim());
                else zNode = pNode.Nodes.Add(Row["node_id"].ToString(), Row["display_access_description"].ToString().Trim());

                if (Convert.ToInt32(Row["is_selected"]) == 1)
                    zNode.Checked = true;
                else if (Convert.ToInt32(Row["is_selected"]) == 0)
                    zNode.Checked = false;
                                    


                BuildRolesTree(Convert.ToInt32(Row["node_id"].ToString()), zNode, SourceDS);
            }
        }
    }

    private void PermissionsNode_AfterCheck(object sender, TreeViewEventArgs e)
    {           
       if(e.Action != TreeViewAction.Unknown)
       {
            if(e.Node.Checked) //leave it checked
               e.Node.Checked = e.Node.Checked????
               //I am looking for something like the below
               //e.Checked.NewValue = e.Checked.CurrentValue;
       }    
     }
}
感谢您的帮助。

您可以处理并设置
e.Cancel=true
以防止更改支票:

private void treeView1_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
    e.Cancel = true;
}
但是,存在一个问题,即检查事件无法按预期工作。遵循我在链接文章中共享的解决方案,或使用以下
ExTreeView
,它具有
CheckBoxEdit
属性(类似于
LabelEdit
),允许您启用或禁用复选框:

public class ExTreeView : TreeView
{
    private const int WM_LBUTTONDBLCLK = 0x0203;
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_LBUTTONDBLCLK)
        {
            var info = this.HitTest(PointToClient(Cursor.Position));
            if (info.Location == TreeViewHitTestLocations.StateImage)
            {
                m.Result = IntPtr.Zero;
                return;
            }
        }
        base.WndProc(ref m);
    }
    [DefaultValue(true)]
    public bool CheckBoxEdit { get; set; } = true;
    protected override void OnBeforeCheck(TreeViewCancelEventArgs e)
    {
        base.OnBeforeCheck(e);
        e.Cancel = !CheckBoxEdit;
    }
}

根据标准处理并设置
e.Cancel=true
。感谢您提供的信息。我应该基于什么标准?如果您希望它们始终为只读,则不需要任何标准。如果您发布解决方案,我会将其标记为答案。请确保您阅读了编辑。