C# 动态创建出来的窗体间的通讯 delegate3

 附件1:http://files.cnblogs.com/xe2011/CSharp_WindowsForms_delegate03.rar

一个RTF文件管理器

描述

  Form2,Form3,Form4都是独立存在的,同时完成独立的功能,相互不依赖。

最后把Form2,Form3,Form4集合放在FORM1上,实际上需要这3个的窗体Form2,Form3,Form4间相互得到改变后的变量值。

FORM2 文件夹列表

      在FORM1中设置一初始文件夹路径  

  要实现的功能:当单击本窗体中的TreeView.node时,要求Form3.ListView的文件列表同时更新。

FORM3 文件列表

  需要得到Form2当前选中的文件夹路径

     要实现的功能:当本窗体中的ListView选中一个节点时时,同时Form4.RichtextBox 打开并读取这个文件。

FORM4是一个RFT编辑器

  需要得到FORM3 文件列表中选中的文件完整路径

     要实现的功能:当单击本窗体中的保存按钮,要保存Form3.ListView中选中的那个文件。

实现步骤

1 创建4个空窗体分别为:Form1.cs,Form2.cs,Form3.cs,Form4.cs

Form1:3个Panel

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }

        Form2 f2 = new Form2();
        Form3 f3 = new Form3();
        Form4 f4 = new Form4();

        private void Form1_Load(object sender, EventArgs e)
        {
            f2.Dock = DockStyle.Fill;
            f2.TopLevel = false;
            f2.FormBorderStyle = FormBorderStyle.FixedToolWindow;
            f2.Parent = panel1;
            f2.Show();

            
            f3.Dock = DockStyle.Fill;
            f3.TopLevel = false;
            f3.FormBorderStyle = FormBorderStyle.FixedToolWindow;
            panel2.Controls.Add(f3);
            f3.Show();


            
            f4.Dock = DockStyle.Fill;
            f4.TopLevel = false;
            f4.FormBorderStyle = FormBorderStyle.FixedToolWindow;
            panel3.Controls.Add(f4);
            f4.Show();

            f2.CallBackPro += new Form2.CallBack(GetForm2TreeViewNodePath);
            f3.CallBackPro += new Form3.CallBack(GetForm3ListViewFileFullPath);
        }

        private void GetForm2TreeViewNodePath(string path)
        {
            f3.DirPath = path;
            f3.UpdateFileListView();
        }

        private void GetForm3ListViewFileFullPath(string s)
        {
             f4.FileName =s;
             f4.LoadFile();
        }
    }
}
View Code

Form2:treeView1,textBox1

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        #region 添加目录

        //目录 D:AdministratorDocumentsTestData
        //返回 D:AdministratorDocuments
        public string GetDirectoryParentPath(string path)
        {
            DirectoryInfo d = new DirectoryInfo(path);
            return d.Parent.FullName;
        }


        /// <summary>
        /// 把一个文件夹的所有文件夹添加 到TREEVIEW中
        /// DirectoryToTreeNode(@"D:AdministratorDocumentsTestData", treeViewCtrl1);
        /// </summary>
        /// <param name="dirPath"></param>
        /// <param name="treeView"></param>
        public void DirectoryToTreeNode(string dirPath, TreeView treeView)
        {
            treeView.Nodes.Clear();
            DirectoryInfo di = new DirectoryInfo(dirPath);
            TreeNode rootNode = new TreeNode(di.Name);
            GetDirs(di.GetDirectories(), rootNode);
            treeView.Nodes.Add(rootNode);
            rootNode.Expand();
        }


        public void GetDirs(DirectoryInfo[] subDirs, TreeNode treeNode)
        {
            foreach (DirectoryInfo d in subDirs)
            {
                TreeNode node = new TreeNode(d.Name, 0, 0);
                DirectoryInfo[] subSubDirs = d.GetDirectories();
                GetDirs(subSubDirs, node);
                treeNode.Nodes.Add(node);
            }
        }
        #endregion


        public delegate void CallBack(string path);
        public event CallBack CallBackPro;

        //public delegate string s ="s";
        public string DirPath = "TestData";// @"D:AdministratorDocumentsTestData";
        private string RootDir = ""; //返回 D:AdministratorDocuments
        public string CurrentPath = "";//当前选中的文件夹
        public string FileExtend = "";//.rtf
        public ListView listView1 = null;  

        private void Form2_Load(object sender, EventArgs e)
        {

         
            RootDir = GetDirectoryParentPath(DirPath);
            DirectoryToTreeNode(DirPath, treeView1);

            CurrentPath = RootDir;
            textBox1.Text = CurrentPath;
        }

        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            TreeNode node = e.Node;
            if (e.Button == MouseButtons.Right)
            { //右键选择节点
                treeView1.SelectedNode = node;
            }
            CurrentPath = RootDir + "\" + e.Node.FullPath;
            textBox1.Text = CurrentPath;

            CallBackPro(CurrentPath);
            //UpdateListViewFileList(CurrentPath);
        }
    }
}
View Code

Form3:listView1,textBox1

代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsApplication1
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }

        #region  function...
        public static void AddFileListToListView1(ListView listView, string path, string FileExtended)
        {
            DirectoryInfo di = new DirectoryInfo(path);
            FileInfo[] fi = di.GetFiles("*" + FileExtended);//只添加.txt的文件

            for (int i = 0; i < fi.Length; i++)
            {
                string fileName1 = fi[i].ToString();
                string fileName2 = RemoveFileExt(fileName1, FileExtended);// fileName1.Replace(FileExtended, "");
                listView.Items.Add(fileName2);
                //listView.Items[i].ImageIndex = 0;
            }
        }
        #region 复制一个文件名不包括扩展名
        //Text = RemoveFileExt(@"C:Tmpquickview_src.zip", ".zip");
        //返回 C:Tmpquickview_src
        public static string RemoveFileExt(string s, string FileExt)
        {
            string value = s;
            string f1 = s.Substring(s.Length - 4, 4);
            if (f1 == FileExt)
                value = s.Substring(0, s.Length - 4);
            return value;
        }
        #endregion

        /// <summary>
        /// 更新目录文件
        /// </summary>
        public void UpdateFileListView()
        {
            listView1.BeginUpdate();
            listView1.Items.Clear();
            AddFileListToListView1(listView1, DirPath, FileExtend);
            //listViewCtrl1.SetSmallIcon(imageList1, 0);
            listView1.EndUpdate();
        }

        #endregion


        public delegate void CallBack(string path);
        public event CallBack CallBackPro;

        public  string DirPath ="";//= "TestData";// @"D:AdministratorDocumentsTestData";
        public string CurrentFileName = "";//当前选中的文件夹
        public string FileExtend = ".rtf";//.rtf

        private void Form3_Load(object sender, EventArgs e)
        {
            DirPath = System.Windows.Forms.Application.StartupPath + "\TestData";
            UpdateFileListView();
            textBox1.Text = CurrentFileName;
        }

        private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listView1.SelectedIndices != null)
            {
                if (listView1.SelectedItems.Count == 1)
                    //--------------------------------"C:abc"  21312 ".rtf"
                    CurrentFileName = DirPath + "\" + listView1.SelectedItems[0].SubItems[0].Text + FileExtend;
            }
            else
            {
                CurrentFileName = ""; 
            }
            textBox1.Text = CurrentFileName;
            CallBackPro(CurrentFileName);
        }
    }
}
View Code

Form4:richTextBox1,toolStrip1,toolStrip1.按钮,textBox1

代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form4 : Form
    {
        public Form4()
        {
            InitializeComponent();
        }

        public string FileName = "";

        public void LoadFile()
        {
            richTextBox1.LoadFile(FileName);
        }

        private void 保存SToolStripButton_Click(object sender, EventArgs e)
        {
            try
            {
                richTextBox1.SaveFile(FileName);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            
        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            textBox1.Text = FileName;
        }





    }
}
View Code

一个SpilterContain拖拽好结果正确的模型架 可以保存SpilterContain的位置 用的是XML

关于效果你可以自己用个splitContainer1 做3个面板 去做个拖拽窗体时大小改变和WINDOWS的EXPLORER一样的 结果为正确

附件2:http://files.cnblogs.com/xe2011/WinForm_ExplorerFrame_Read_AndSave_XML.rar

原文地址:https://www.cnblogs.com/xe2011/p/3440340.html