有2个窗体,一个是主界面,另一个是添加页面,添加页面有4个文本框,为TreeView控件上的节点名,输入内容(节点)后点确定按钮,传值到主界面窗体的Treeview控件上显示出来,并写入到XML文件中保存
最简单的做法就是在添加页面保存一个TreeView的对象引用,然后再添加页面实现节点添加时候,直接引用TreeView来添加就可以了
可以写具体点的代码给我吗?其中跨界传值的实现我搞不出来~
@哈哈练:
用个简单例子说吧,基于WPF工程,如果你是winform,那么就是控件一些操作上的差异了.
1. 新建个TreeViewUtil类,保存有treeview的一个实例,同时提供几种方法用于添加节点
public class TreeViewUtil { private TreeView _treeVIew = null; //初始操作的treeView对象 public void setTreeViewInstance(TreeView tv) { this._treeVIew = tv; } public TreeView TreeViewInstance { get { return this._treeVIew; } } //添加节点到指定的节点下面 public TreeViewItem AddNewNode(TreeViewItem parentItem, string content) { if (this._treeVIew == null) { return null; } TreeViewItem addItem = new TreeViewItem(); addItem.Header = content; parentItem.Items.Add(addItem); return addItem; } //添加根节点 public TreeViewItem AddNewNode(string content) { if (this._treeVIew == null) { return null; } TreeViewItem item = new TreeViewItem() { Header = content }; this._treeVIew.Items.Add(item); return item; } // 用于单例访问 private static TreeViewUtil _instance = null; public static TreeViewUtil Instance { get { return _instance == null ? (_instance = new TreeViewUtil()) : _instance; } } }
2. 主界面MainWindow窗体,包含两个控件一个button,一个treeView,button用于show除添加页面窗体,代码如下
private void Button_Click_1(object sender, RoutedEventArgs e) {
//这里一定要设置下操作的treeView TreeViewUtil.Instance.setTreeViewInstance(this._treeView); (new Window1()).Show(); }
3.然后转到添加页面window,该窗体包含有两个控件一个文本框一个按钮,按钮用于向treeView上添加节点,例如:
private void _btnAddNode_Click_1(object sender, RoutedEventArgs e) { TreeViewUtil instance = TreeViewUtil.Instance; if (instance != null) { string content = this._nodeName.Text; instance.AddNewNode(content); } }
上面我是像根节点加,所以如果你要往指定的节点添加使用另一个方法了,同时也要做好保存的节点的工作
4. 最后就是同步到XML的问题,那其实更加简单了,可以考虑使用Linq to xml,在3中添加节点代码后,同时调用保存到XML的操作(后面基本就是XML操作和自己想怎么在XML中组织数据问题)
5.至于如果你想在加载主界面时候同时加载XML数据并初始化treeView。那其实也简单,操作就是读,然后通过TreeViewUtil方法来实现了
+ PS: 以上只是为了说明问题,实际生产中请做些别的修改,顺带传值方式很多,也没有必要选择上面的这种方式
@哈哈练:
例如上面的,在TreeViewUtil在添加几个函数
ublic void SaveTreeViewToXML(string saveXmlFile) { //1.了解xml的写入操作,最好考虑用Linq to xml //2. 对TreeView中数据如何组织到XML中,需要自己思考了 } public void InitTreeViewFromXML(string saveXMLFILE) { //从XML文件中读取数据,然后初始化TreeView节点 } public void SyncNodeToXML(TreeViewItem node) { //同步新节点数据到XML } public void SyncDataToXml(TreeViewItem item, string data) { //同步某节点数据到XML中相应的节点数据 }
@visonme: 谢谢啦!
业务逻辑:主窗体点击添加按钮弹出添加窗体,输入相关信息点击确认,主页面tree添加节点, 点击取消,不做操作
实现:添加窗体中 写一个属性(如果你的内容多属性可以是一个model) 主页面添加按钮以showdialog方式弹出添加窗体
添加窗体确认,取消事件分别用:DialogResult = DialogResult.OK; DialogResult = DialogResult.Cancel;来关闭添加窗体
主窗体通过:
AddForm1 f = new AddForm1 (); if (f.ShowDialog() == DialogResult.OK) { //f.xx xx属性 //这里操作tree }
怎么跨界传值并写入到XML文件中保存呢?下次打开主界面时还能看到最后操作的节点。。。
@哈哈练: 你不要固定思维, 我为什么一样进行传值嘛, 我直接访问不行嘛?
首先这个AddForm1里面你要写一个属性 :public string xx{get;set;}
你在点了确认之后 就把你的textbox的值赋给xx 然后DialogResult = DialogResult.OK;这个时候窗体就会关闭,并跳转到上面代码的if判断, 如果是ShowDialog()返回的值是OK那么你就可以在里面做你想要的操作,然后这个时候访问 f.xx 就能得到值 懂了没, 就相当于AddForm1是一个普通类 你加一个xx属性 然后内部赋了值 外面直接用就行了
@哈哈练: 至于保存数据 你各人切找咋个操作xml
@jio92: 操作tree是写在哪个事件中?
@哈哈练: 上面那一段代码就是你主窗体添加事件里的代码 你在就在if里面写个 tree.Node.Add(f.xx) 不就完了
@jio92: 所以你这是告诉我怎么跳转窗体么?跳来跳去么?这些我都解决了,能解决我问题的重点么?
@哈哈练: 唉 朋友 是我没描述清楚 还是你没看懂 我是在说你应该用哪种方案来得到你添加窗体中的数据,你得到数据了 你要保存,你要在tree里添加节点 等各种啥子操作是你来定
@jio92: 谢谢!但是我还是没懂~