首页 新闻 会员 周边

窗体 文本框输入节点名添加到另一个窗体的TreeView上

0
悬赏园豆:30 [已解决问题] 解决于 2015-07-29 16:48

有2个窗体,一个是主界面,另一个是添加页面,添加页面有4个文本框,为TreeView控件上的节点名,输入内容(节点)后点确定按钮,传值到主界面窗体的Treeview控件上显示出来,并写入到XML文件中保存

哈哈练的主页 哈哈练 | 初学一级 | 园豆:113
提问于:2015-07-29 15:04
< >
分享
最佳答案
0

最简单的做法就是在添加页面保存一个TreeView的对象引用,然后再添加页面实现节点添加时候,直接引用TreeView来添加就可以了

收获园豆:20
visonme | 小虾三级 |园豆:1674 | 2015-07-29 15:18

可以写具体点的代码给我吗?其中跨界传值的实现我搞不出来~

哈哈练 | 园豆:113 (初学一级) | 2015-07-29 15:56

@哈哈练: 

用个简单例子说吧,基于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;
            }
        }

    }
View Code

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: 以上只是为了说明问题,实际生产中请做些别的修改,顺带传值方式很多,也没有必要选择上面的这种方式 

visonme | 园豆:1674 (小虾三级) | 2015-07-29 16:24

@哈哈练: 

例如上面的,在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 | 园豆:1674 (小虾三级) | 2015-07-29 16:33

@visonme: 谢谢啦!

哈哈练 | 园豆:113 (初学一级) | 2015-07-29 16:34
其他回答(1)
1

业务逻辑:主窗体点击添加按钮弹出添加窗体,输入相关信息点击确认,主页面tree添加节点,  点击取消,不做操作

实现:添加窗体中 写一个属性(如果你的内容多属性可以是一个model)    主页面添加按钮以showdialog方式弹出添加窗体

添加窗体确认,取消事件分别用:DialogResult = DialogResult.OK;  DialogResult = DialogResult.Cancel;来关闭添加窗体

主窗体通过:

AddForm1 f = new AddForm1 ();
if (f.ShowDialog() == DialogResult.OK)
{
    //f.xx xx属性
    //这里操作tree
}    
收获园豆:10
jio92 | 园豆:1064 (小虾三级) | 2015-07-29 15:58

怎么跨界传值并写入到XML文件中保存呢?下次打开主界面时还能看到最后操作的节点。。。

支持(0) 反对(0) 哈哈练 | 园豆:113 (初学一级) | 2015-07-29 16:05

@哈哈练: 你不要固定思维, 我为什么一样进行传值嘛,  我直接访问不行嘛?

首先这个AddForm1里面你要写一个属性 :public string xx{get;set;} 

你在点了确认之后  就把你的textbox的值赋给xx  然后DialogResult = DialogResult.OK;这个时候窗体就会关闭,并跳转到上面代码的if判断, 如果是ShowDialog()返回的值是OK那么你就可以在里面做你想要的操作,然后这个时候访问 f.xx 就能得到值  懂了没, 就相当于AddForm1是一个普通类  你加一个xx属性 然后内部赋了值 外面直接用就行了

支持(1) 反对(0) jio92 | 园豆:1064 (小虾三级) | 2015-07-29 16:12

@哈哈练: 至于保存数据   你各人切找咋个操作xml 

支持(0) 反对(0) jio92 | 园豆:1064 (小虾三级) | 2015-07-29 16:15

@jio92: 操作tree是写在哪个事件中?

支持(0) 反对(0) 哈哈练 | 园豆:113 (初学一级) | 2015-07-29 16:20

@哈哈练: 上面那一段代码就是你主窗体添加事件里的代码  你在就在if里面写个 tree.Node.Add(f.xx)  不就完了

支持(0) 反对(0) jio92 | 园豆:1064 (小虾三级) | 2015-07-29 16:23

@jio92: 所以你这是告诉我怎么跳转窗体么?跳来跳去么?这些我都解决了,能解决我问题的重点么?

支持(0) 反对(0) 哈哈练 | 园豆:113 (初学一级) | 2015-07-29 16:25

@哈哈练: 唉  朋友   是我没描述清楚 还是你没看懂  我是在说你应该用哪种方案来得到你添加窗体中的数据,你得到数据了 你要保存,你要在tree里添加节点 等各种啥子操作是你来定  

支持(0) 反对(0) jio92 | 园豆:1064 (小虾三级) | 2015-07-29 16:32

@jio92: 谢谢!但是我还是没懂~

支持(0) 反对(0) 哈哈练 | 园豆:113 (初学一级) | 2015-07-29 16:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册