简体   繁体   English

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

[英]Prevent user from altering Check boxes in TreeView

I have a winforms treeview with nodes added and check state set programmatically based on the database values.我有一个添加了节点的 winforms treeview,并根据数据库值以编程方式检查 state 设置。 I am trying to prevent users from altering the check status and am having trouble.我试图阻止用户更改检查状态并且遇到了麻烦。 I am not sure what event to fire to keep the check state unaltered.我不确定要触发什么事件来保持检查 state 不变。

Below is my code:下面是我的代码:

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;
       }    
     }

} }
ANy help is appreciated.任何帮助表示赞赏。

You can handle BeforeCheck and set e.Cancel = true to prevent changing the check:您可以处理BeforeCheck并设置e.Cancel = true以防止更改检查:

private void treeView1_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
    e.Cancel = true;
}

However, there is a problem in TreeView when double click on CheckBoxes the check events not work as expected.但是,当双击 CheckBoxes 时,TreeView 中存在问题,检查事件无法按预期工作。 Follow the solution that I've shared in the linked post or use the following ExTreeView which has a CheckBoxEdit property (similar to LabelEdit ) which allows you enable or disable checking on CheckBoxes:按照我在链接帖子中共享的解决方案或使用以下ExTreeView具有CheckBoxEdit属性(类似于LabelEdit ),它允许您启用或禁用对 CheckBoxes 的检查:

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;
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM