附件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();
}
}
}

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, , );
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 = ; 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 - , );
if (f1 == FileExt)
value = s.Substring(, s.Length - );
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 == )
//--------------------------------"C:\abc\" 21312 ".rtf"
CurrentFileName = DirPath + "\\" + listView1.SelectedItems[].SubItems[].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:http://files.cnblogs.com/xe2011/WinForm_ExplorerFrame_Read_AndSave_XML.rar

C# 动态创建出来的窗体间的通讯 delegate3的更多相关文章

  1. C# 动态创建出来的窗体间的通讯 delegate2

    附件:http://files.cnblogs.com/xe2011/CSharp_WindowsForms_delegate02.rar 窗体2 和窗体3 都是动态创建出来的 现在 FORM3.TE ...

  2. C# 动态创建出来的窗体间的通讯 delegate1

    附件 http://files.cnblogs.com/xe2011/CSharp_WindowsForms_delegate01.rar 需要每个窗体是独立存在,禁止相与引用窗体 这样干净并且可以反 ...

  3. 自定义事件实现不同窗体间的通讯Delphi篇

    要实现子窗体与父窗体之间的通讯,有多种方法(比如:重载子窗体的构造函数,将父窗体的引用作为参数传递给子窗体).下面我要介绍的是利用自定义事件的方法,它能够最大程度的避免模块之间的耦合,充分体现面向对象 ...

  4. C#窗体间传值的简便方法/工具

    一.问题:窗体间传值必须需要窗体之间有联系,具体有如下方式 窗体间传值涉及到窗体A必须拥有窗体B,这样才可以实现A-B之间传值 窗体A与窗体B在窗体/实例C中,A-B可互相通讯 其他方式,不细讨论,复 ...

  5. C# 学习笔记(一) Winform利用Assembly反射动态创建窗体

    1. 添加Reflection //添加对Reflection程序集引用 using System.Reflection; // 引用窗体创建方法CreateForm,传入参数 private voi ...

  6. Delphi中动态创建窗体有四种方式

    Delphi中动态创建窗体有四种方式,最好的方式如下: 比如在第一个窗体中调用每二个,主为第一个,第二个设为动态创建 Uses Unit2; //引用单元文件 procedure TForm1.But ...

  7. c#反射动态创建窗体

    根据窗体的名称动态创建窗体 Assembly assembly = Assembly.GetExecutingAssembly();             // 实例化窗体 try { Form f ...

  8. DELPHI动态创建窗体

    //第一种方式 procedure TForm1.btn1Click(Sender: TObject); begin With TForm2.Create(Application) do Try Sh ...

  9. winform 用户控件、 动态创建添加控件、timer控件、控件联动

    用户控件: 相当于自定义的一个panel 里面可以放各种其他控件,并可以在后台一下调用整个此自定义控件. 使用方法:在项目上右键.添加.用户控件,之后用户控件的编辑与普通容器控件类似.如果要在后台往窗 ...

随机推荐

  1. Makefile与shell脚本的区别

    引用博客:Makefile与shell脚本区别 在Makefile可以调用shell脚本,但是Makefile和shell脚本是不同的.本文试着归纳一下Makefile和shell脚本的不同. 1.s ...

  2. iOS - 打电话, 发短信

    电话.短信是手机的基础功能,iOS中提供了接口,让我们调用.这篇文章简单的介绍一下iOS的打电话.发短信在程序中怎么调用. 1.打电话 [[UIApplication sharedApplicatio ...

  3. 支付宝Demo 报错

    支付宝SDK-------DEMO第一次编译肯定是会报错的: 修正的方法为:   打开项目属性->Build Settings 找到 Library SearchPaths   看见里面的参数了 ...

  4. C连接MySQL数据库开发之Linux环境完整示例演示(增、删、改、查)

    一.开发环境 ReadHat6.3 32位.mysql5.6.15.gcc4.4.6 二.编译 gcc -I/usr/include/mysql -L/usr/lib -lmysqlclient ma ...

  5. POJ 2992 Divisors

    每个数都可以分解成素数的乘积: 写成指数形式:n=p1^e1*p2^e2*...*pn^en:(p都是素数) 那么n的因数的数量m=(e1+1)*(e2+1)*...*(en+1): 所以用筛选法筛出 ...

  6. NWERC 2012 Problem A Admiral

    一个最小费用最大流的简单建模题: 比赛的时候和小珺合力想到了这个题目的模型: 方法:拆点+边的容量为1 这样就可以保证他们不会在点上和边上相遇了! 感谢刘汝佳大神的模板,让我这个网络流的小白A了这个题 ...

  7. 中间人攻击之arp欺骗 科普ARP欺骗

    中间人攻击之arp欺骗 科普ARP欺骗 A <-> B A中有个ARP Table,每次发包都会在此Table中查找,若找不到,发APR Request包询问.此时若hacker冒充B的M ...

  8. struts2文件下载出现Can not find a java.io.InputStream with the name的错误

    今天在用struts2就行文件下载时出现如下错误: Servlet.service() for servlet default threw exception java.lang.IllegalArg ...

  9. [YZOJ1579]&&[BZOJ2450]arr

    Description 给出3*n个数xi,要求构造三个长度为n的序列ai,bi,ci,使得满足下列条件: 1到3*n的每个数都在三个序列中的某个出现一次且仅一次: S=sum((x[ai]-x[bi ...

  10. Unity3D之资源问题处理

    你做的东西如果是100%完整版 你就用 流媒体资源 Streaming Assets http://game.ceeger.com/Manual/StreamingAssets.html 你如果是类微 ...