1

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

我想区分用户的点击,以便在树视图更改之前保存它的状态。

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

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

另一个想法,也许我可以用窗口聚焦或控制做一些事情。例如,如果窗口在模拟时没有聚焦,如果它发生在用户检查树节点复选框的操作期间,我可以保存焦点更改。

附加信息

模拟的复选框点击由以下代码调用:

e.Node.Checked = false;

这会触发事件: private void tree_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)

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

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

4

2 回答 2

1

你试过这个CheckBox.Click活动吗?

这可以很容易地告诉用户正在单击以进行更改。

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

/// <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.
    }

}
于 2012-12-13T20:09:54.837 回答
0

您能否向我们提供一些您尝试过的代码?

如果用户只会单击父节点并且您只会选择子节点,那么也许您可以在“如果父节点,则执行,否则返回”的事件触发期间进行简单检查

于 2012-12-13T20:08:15.903 回答