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();
}
}
}
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的更多相关文章
- C# 动态创建出来的窗体间的通讯 delegate2
附件:http://files.cnblogs.com/xe2011/CSharp_WindowsForms_delegate02.rar 窗体2 和窗体3 都是动态创建出来的 现在 FORM3.TE ...
- C# 动态创建出来的窗体间的通讯 delegate1
附件 http://files.cnblogs.com/xe2011/CSharp_WindowsForms_delegate01.rar 需要每个窗体是独立存在,禁止相与引用窗体 这样干净并且可以反 ...
- 自定义事件实现不同窗体间的通讯Delphi篇
要实现子窗体与父窗体之间的通讯,有多种方法(比如:重载子窗体的构造函数,将父窗体的引用作为参数传递给子窗体).下面我要介绍的是利用自定义事件的方法,它能够最大程度的避免模块之间的耦合,充分体现面向对象 ...
- C#窗体间传值的简便方法/工具
一.问题:窗体间传值必须需要窗体之间有联系,具体有如下方式 窗体间传值涉及到窗体A必须拥有窗体B,这样才可以实现A-B之间传值 窗体A与窗体B在窗体/实例C中,A-B可互相通讯 其他方式,不细讨论,复 ...
- C# 学习笔记(一) Winform利用Assembly反射动态创建窗体
1. 添加Reflection //添加对Reflection程序集引用 using System.Reflection; // 引用窗体创建方法CreateForm,传入参数 private voi ...
- Delphi中动态创建窗体有四种方式
Delphi中动态创建窗体有四种方式,最好的方式如下: 比如在第一个窗体中调用每二个,主为第一个,第二个设为动态创建 Uses Unit2; //引用单元文件 procedure TForm1.But ...
- c#反射动态创建窗体
根据窗体的名称动态创建窗体 Assembly assembly = Assembly.GetExecutingAssembly(); // 实例化窗体 try { Form f ...
- DELPHI动态创建窗体
//第一种方式 procedure TForm1.btn1Click(Sender: TObject); begin With TForm2.Create(Application) do Try Sh ...
- winform 用户控件、 动态创建添加控件、timer控件、控件联动
用户控件: 相当于自定义的一个panel 里面可以放各种其他控件,并可以在后台一下调用整个此自定义控件. 使用方法:在项目上右键.添加.用户控件,之后用户控件的编辑与普通容器控件类似.如果要在后台往窗 ...
随机推荐
- Android中JNI编程的那些事儿(1)
转:Android中JNI编程的那些事儿(1)http://mobile.51cto.com/android-267538.htm Android系统不允许一个纯粹使用C/C++的程序出现,它要求必须 ...
- 第 17 章 责任链模式【Chain of Responsibility Pattern】
以下内容出自:<<24种设计模式介绍与6大设计原则>> 中国古代对妇女制定了“三从四德”的道德规范,“三从”是指“未嫁从父.既嫁从夫.夫死从子”,也就是说一个女性,在没有结婚的 ...
- Hdu 2971 Tower
Description Alan loves to construct the towers of building bricks. His towers consist of many cuboid ...
- iOS开发UI篇—UITableviewcell的性能问题
iOS开发UI篇—UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource ...
- 码云分布式之 Brzo 服务器
摘要: 码云是国内最大的代码托管平台,为了支持更大的用户规模,开发团队也在对一些组件进行大规模的重构. 前言 码云是国内最大的代码托管平台.码云基于 Gitlab 5.5 开发,经过几年的开发已经和官 ...
- C# 如何为应用程序加入多个图标?
对于WINDOWS XP操作系统,浏览文件时有列表,图标和平铺三种,显示出文件图标的大小分别为16x16,32x32,48x48这三种尺寸.有些程序包含这三个尺寸的图标,随着浏览文件时的设置来选择尺寸 ...
- picturebox 图片自适应
picturebox控件共有两种载入图片方式,分别为: pictureBox1.BackgroundImage = Image,pictureBox1.load(url) 为使加载的图片自使用控件尺寸 ...
- BI名词解释
BI名词解释 浏览数Page Views: 网页(含文件及动态网页)被访客浏览的次数.Page View的计算范围包括了所有格式的网页,例如:.htm..html..asp..cfm. asa ...
- C# Web版报表
1.添加ReportViewer 2.添加ObjectDataSource 3.须添加一个ScriptManager 4.添加并设计一个报表用数据集 5.设计rdlc报表,数据源选择第4步的数据集 6 ...
- ASP.NET返回Json数据
Schedule.ashx: <%@ WebHandler Language="C#" Class="Schedule" %> using Syst ...