我有一个winform,显示一个Treeview控件,每当winform打开时,它会被一大堆节点填充。我的代码允许用户选择一个节点,然后打开一个小对话框,输入一个值,然后编辑节点的文本。
当用户关闭表单时,是否可以检查整个树视图的更改?
我在考虑将所有节点总结为一个字符串,然后在关闭表单时,将其再次作为一个新字符串加总并将其与之前生成的字符串进行比较,但我认为有更好的方法可以做到这一点
答案 0 :(得分:2)
这是一个相当常见的谬误,TreeView(如ListBox和ListView)没有通知节点集合发生更改的事件。有一个很好的理由,用户自己无法做任何事情来添加或删除节点。只有您的代码可以做到这一点。并且你无法知道这一点。换句话说,您不需要通知您已经知道的事情。
如果您想要一个活动,那么您可以添加自己的活动。并在代码更改节点集合时触发它。请注意,这是一种代码味道,您几乎总是希望在模型上使用此类通知而不是视图。
答案 1 :(得分:0)
虽然如果您预先缓存了节点,可以检查TreeView
所有更改,但我认为正确的方法是在更改发生时对其进行管理。例如,当打开编辑节点的表单时,就会以这样的形式传递:
private Form1 _f;
...
public Form2(Form1 f)
{
this._f = f;
}
然后override
OnClosing
Form2
这样的方法:
protected override void OnClosing(CancelEventArgs e)
{
this._f.SetChangedNode(...);
}
并在SetChangedNode
上创建Form1
方法。我不知道这些参数是什么样的,但它们可能类似于TreeNode node, string newLabel
,然后您可以轻松地将这些值存储在Dictionary<TreeNode, string>
中,然后在关闭时利用Dictionary
申请。
答案 2 :(得分:0)
简短回答:是的,有可能。
如果您坚持等待保存或注册更改,直到应用程序关闭,您可以编写一个简单的递归函数来遍历旧版本的当前版本(可能更改的工作内存)(从您保存它的时候加载) )。生病离开实施给你。无论如何,这里有一些灵感:
http://en.wikipedia.org/wiki/Tree_traversal
个人id考虑通过按ok或save来关闭编辑表单时保存用户所做的任何更改。