Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与树视图中复选框的模拟操作相比,如何检测用户操作?_C#_Forms_Event Handling_Treeview_Focus - Fatal编程技术网

C# 与树视图中复选框的模拟操作相比,如何检测用户操作?

C# 与树视图中复选框的模拟操作相比,如何检测用户操作?,c#,forms,event-handling,treeview,focus,C#,Forms,Event Handling,Treeview,Focus,我有一个树状视图,其中包含可扩展的项目列表。当用户选中父节点的复选框时,我模拟检查子节点。但是,用户可以检查任何节点(不仅仅是父节点)。我想区分用户的第一次单击(触发节点的复选框事件)与子节点复选框的模拟检查 我想区分用户的点击,这样我就可以在树视图改变之前保存它的状态 我曾想过使用mousedown事件,但这不起作用,因为用户可能会单击以展开某些内容,而且我不想保存树视图的状态,因为没有任何更改。实现这一点的一种方法是计算每个复选框位置的尺寸,然后检查鼠标向下的单击坐标,但我希望避免这样做,因

我有一个树状视图,其中包含可扩展的项目列表。当用户选中父节点的复选框时,我模拟检查子节点。但是,用户可以检查任何节点(不仅仅是父节点)。我想区分用户的第一次单击(触发节点的复选框事件)与子节点复选框的模拟检查

我想区分用户的点击,这样我就可以在树视图改变之前保存它的状态

我曾想过使用mousedown事件,但这不起作用,因为用户可能会单击以展开某些内容,而且我不想保存树视图的状态,因为没有任何更改。实现这一点的一种方法是计算每个复选框位置的尺寸,然后检查鼠标向下的单击坐标,但我希望避免这样做,因为这并不容易,因为我有嵌套节点,所以复选框可能有几个不同的列

思考这个问题的另一种方式是,我想将一组事件转化为行动。因此,一个动作将代表用户的第一个动作,以及随后的所有模拟动作,直到控件返回给用户为止

另一个想法是,也许我可以做一些窗口聚焦或控制。例如,如果在模拟过程中窗口没有聚焦,如果在用户选中树节点复选框的操作过程中发生聚焦更改,我可以只保存聚焦更改

附加信息 模拟的复选框单击由以下代码调用:

e、 Node.Checked=false

这将触发事件: 私有无效树\u事后检查(对象发送者,System.Windows.Forms.TreeViewEventArgs e)

当用户单击节点时,将触发此AfterCheck事件。我想保存这棵树的状态。但是在AfterCheck事件中,存在检查其他节点导致AfterCheck事件再次触发n次的情况,但这次是模拟检查复选框


Systems.Windows.Forms.TreeView在所有情况下都是发件人对象。

您能提供一些您尝试过的代码吗


如果用户只单击父节点,而您只选择子节点,那么您可能可以在事件触发器期间执行一个简单的检查,显示“如果是父节点,则执行,否则返回”

您可以为我们提供一些您尝试过的代码吗

如果用户只单击父节点,而您只选择子节点,那么您可能可以在事件触发器期间执行一个简单的检查,显示“如果是父节点,则执行,否则返回”

是否尝试了该事件

这将很容易判断用户正在单击进行更改

您还可以使用一个标志来指示引发的任何事件都是因为该方法正在进行更改。由于这是一个windows窗体,因此在您的进程完成之前,用户将无法选中另一个框(因此不存在电缆管道条件)

//
///可由复选框访问的标志,该复选框指示程序正在进行更改还是用户正在进行更改。
/// 
bool programmaticallySettingChecks{get;set;}
受保护的空鞭毛示例()
{
复选框[]chToCheck=new复选框[10];//设置选中属性的复选框集合。
programmaticallySettingChecks=真;
for(int i=0;i
您尝试过该活动吗

这将很容易判断用户正在单击进行更改

您还可以使用一个标志来指示引发的任何事件都是因为该方法正在进行更改。由于这是一个windows窗体,因此在您的进程完成之前,用户将无法选中另一个框(因此不存在电缆管道条件)

//
///可由复选框访问的标志,该复选框指示程序正在进行更改还是用户正在进行更改。
/// 
bool programmaticallySettingChecks{get;set;}
受保护的空鞭毛示例()
{
复选框[]chToCheck=new复选框[10];//设置选中属性的复选框集合。
programmaticallySettingChecks=真;
for(int i=0;i
我已编辑了您的标题。请参阅“”,其中一致意见是“不,他们不应该”。在每种情况下,您的发件人对象引用的对象是什么System.Windows.Forms.TreeView是每种情况下的发件人对象。如果我的建议都不充分,则我需要您提供基本代码示例,以便我可以看到您正在做什么。我已编辑了您的标题。请参见“”,其中共识是“不,他们不应该”。在每种情况下,您的发件人对象指的是什么对象System.Windows.Forms.TreeView是每种情况下的发件人对象。如果我的建议都不充分,那么我需要您提供基本的代码示例,以便我可以看到您在做什么。感谢您的建议,我很感激。最后,我使用了一个标志,根据所引发的事件,我采取了我需要采取的适当行动。很抱歉延迟回复,我正在使用此解决方案测试结果,执行起来已经足够了。@Brandon没问题,很高兴我能提供帮助。谢谢您的建议,我非常感谢。我最终使用了fl
/// <summary>
/// Flag which can be accessed by the checkboxes which indicates if the program is making the change or the user is.
/// </summary>
bool programmaticallySettingChecks { get; set; }

protected void FlagExample()
{
    CheckBox[] chToCheck = new CheckBox[10];        //Collection of checkboxes to set the Checked property on.

    programmaticallySettingChecks = true;

    for (int i = 0; i < chToCheck.Length; i++)
    {
        chToCheck[0].Checked = true;
    }

    programmaticallySettingChecks = false;
}

protected void Check_Clicked(Object sender, EventArgs e)
{
    if (programmaticallySettingChecks)
    {
        //do things which are done if setting programmatically.
    }
    else
    {
        //Do things which are done if user sets.
    }

}