我有一个树视图,其中包含可扩展的项目列表。当用户选中父节点的复选框时,我会模拟选中子节点。但是,用户可以检查任何节点(而不仅仅是父节点)。我想将触发节点复选框事件的用户第一次单击与子节点复选框的模拟检查区分开来。
我想区分用户的点击,这样我就可以在树视图更改之前保存它的状态。
我曾想过使用mousedown事件,但这不起作用,因为用户可能会单击以展开某些内容,而且我不想保存树视图的状态,因为没有任何更改。实现这一工作的一种方法是计算每个复选框位置的尺寸,然后检查鼠标向下的点击坐标,但我希望避免这样做,因为这并不容易,因为我有嵌套的节点,所以复选框可能有几个不同的列。
另一种思考方式是,我想把一组组事件变成行动。因此,一个操作将代表用户的第一个操作,以及随后的所有模拟操作,直到控制权返回给用户。
另一个想法是,也许我可以用窗口聚焦或控制做点什么。例如,如果窗口在模拟时没有聚焦,如果在用户选中树节点复选框的过程中发生焦点更改,我可以保存焦点更改。
其他信息
模拟的复选框点击由以下代码调用:
e.Node.Checked=false;
这会触发事件:private void tree_AfterCheck(对象发送方,System.Windows.Forms.TreeViewEventArgs e)
当用户单击某个节点时,会触发此AfterCheck事件。我想保存这棵树的状态。但在AfterCheck事件中,存在检查其他节点的情况,导致AfterCheck活动再次触发n次,但这一次模拟了对复选框的检查。
Systems.Windows.Forms.TreeView在任何情况下都是发送方对象。
您尝试过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.
}
}
你能给我们提供一些你尝试过的代码吗?
如果用户只点击父节点,而你只选择子节点,那么也许你可以在事件触发期间做一个简单的检查,显示"如果是父节点,则执行,否则返回">