2

我有一个 winform,显示一个 Treeview 控件,每当 winform 打开时,就会填充一大堆节点。我的代码允许用户选择一个节点,然后打开一个小对话框,输入一个值,然后编辑节点的文本。

当用户关闭表单时,是否可以检查整个树视图的更改?

我正在考虑将所有节点汇总为一个字符串,然后在关闭表单时,将其再次汇总为一个新字符串并将其与之前制作的字符串进行比较,但我认为有更好的方法可以做到这一点。

4

3 回答 3

2

这是一个相当常见的谬误,TreeView(如 ListBox 和 ListView)没有通知节点集合已更改的事件。有一个很好的理由,用户自己不能做任何事情来添加或删除节点。只有您的代码才能做到这一点。你不可能不知道这一点。或者换一种说法,你不需要被通知你已经知道的事情。

如果你想要一个事件,那么你可以添加你自己的。并在您的代码更改节点集合时触发它。请注意,这是一种代码异味,您几乎总是希望在模型而不是视图上看到这种通知。

于 2013-04-23T12:59:02.757 回答
0

如果您预先缓存节点,您可以检查TreeView所有更改,但我认为正确的方法是在更改发生时对其进行管理。例如,当打开编辑节点的表单时,您来自的表单是这样的:

private Form1 _f;

...

public Form2(Form1 f)
{
    this._f = f;
}

然后是这样overrideOnClosing方法Form2

protected override void OnClosing(CancelEventArgs e)
{
    this._f.SetChangedNode(...);
}

SetChangedNodeForm1. 我不知道这些参数是什么样的,但它们可能类似于TreeNode node, string newLabel,然后您可以轻松地将这些值存储在 a 中Dictionary<TreeNode, string>,然后Dictionary在关闭应用程序时利用它。

于 2013-04-23T12:22:12.097 回答
0

简短的回答:是的,这是可能的。

如果您坚持等待保存或注册更改直到应用程序关闭,您可以编写一个简单的递归函数来遍历当前版本(可能更改的工作内存)和旧版本(从您保存它的任何地方加载)。我将把实施留给你。无论如何,这里有一些灵感:

http://en.wikipedia.org/wiki/Tree_traversal

个人 id 考虑在按确定或保存关闭编辑表单时保存用户所做的任何更改。

于 2013-04-23T12:27:46.437 回答