C# 动态创建出来的窗体间的通讯 delegate3
附件1:https://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(); } } }
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:\Administrator\Documents\TestData //返回 D:\Administrator\Documents public string GetDirectoryParentPath(string path) { DirectoryInfo d = new DirectoryInfo(path); return d.Parent.FullName; } /// <summary> /// 把一个文件夹的所有文件夹添加 到TREEVIEW中 /// DirectoryToTreeNode(@"D:\Administrator\Documents\TestData", 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:\Administrator\Documents\TestData"; private string RootDir = ""; //返回 D:\Administrator\Documents 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); } } }
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:\Tmp\quickview_src.zip", ".zip"); //返回 C:\Tmp\quickview_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:\Administrator\Documents\TestData"; 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); } } }
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; } } }
一个SpilterContain拖拽好结果正确的模型架 可以保存SpilterContain的位置 用的是XML
关于效果你可以自己用个splitContainer1 做3个面板 去做个拖拽窗体时大小改变和WINDOWS的EXPLORER一样的 结果为正确
附件2:https://files.cnblogs.com/xe2011/WinForm_ExplorerFrame_Read_AndSave_XML.rar