4.3 实现文本编辑器的存取文件功能
文本编辑器都具有文件存取功能,顶级菜单项文件的弹出菜单中一般包括如下菜单项:
新建、打开、关闭、保存和另存为等。本节实现以上菜单项。
4.3.1 OpenFileDialog 和 SaveFileDialog 控件
OpenFileDialog 对话框用来选择要打开的文件路径及文件名,
SaveFileDialog 对话框用来选择要存储文件的路径及文件名。
它们的属性和方法基本相同,这里在一起介绍。
? 属性 Filter :字符串类型,选择在对话框中显示的文件类型。属性 Filter 有多项,中
间用| 分开,每两项是一组, 每组的第一项将出现在对话框保存类型 (T) 下拉列表编辑框
的下拉列表中,供用户选择, 第二项表示如第一项被选中, 对话框实际列出的文件。
例如 Filter=" 纯文本文件 (*.txt)|*.txt| 所有文件 (*.*)|*.*" ,表示打开
对话框, 对话框的文件类型 (T) 下拉列表编辑框的下拉列表有两项: 纯文本文件 (*.txt)
和所有文件 (*.*) ,供用户选择。如果从文件类型下拉列表编辑框的下拉列表中选中"
纯文本文件 (*.txt)" ,表示打开对话框,只列出所有扩展名为 .txt 的文件,如果选中"
所有文件 (*.*)" ,表示打开对话框,将列出所有文件。
? 属性 FilterIndex :表示打开对话框后,对话框的文件类型 (T) 下拉列表编辑框的下拉
列表中首先被选中的项的索引号。可以在设计阶段在属性窗口修改属性 FilterIndex
和 Filter ,也可在程序中用下列语句修改: openFileDialog1.Filter=" 纯文本文件
(*.txt)|*.txt| 所有文件 (*.*)|*.*",openFileDialog1.FilterIndex=1 。
? 属性 FileName :用户选取的文件的路径和文件名。
? 属性 InitialDirectory :打开对话框首先显示该属性指定的文件夹中的文件。
? 属性 DefaultExt :如果用户未指定扩展名,自动增加属性指定的文件扩展名。
? 方法 ShowDialog() :打开对话框,根据方法的返回值确定用户单击了那个按钮,如返
回 DialogResult.Cancle ,用户单击了忽略按钮,如返回 DialogResult.OK ,用户单击
了打开或保存按钮
4.3.2 存取文件功能的实现
(4) 把 OpenFileDialog 和 SaveFileDialog 控件放到窗体中。 属性 Name 分别是 openFileDialog1
和 saveFileDialog1。
(5) 增加顶级菜单项:文件,为其弹出菜单增加菜单项:新建、打开 ...、保存 ...、另存为 ...、
退出。修改 Name 属性分别为: mainMenuFile 、menuItemFileNew 、menuItemFileOpen、
menuItemFileSave、menuItemFileSaveAs、menuItemFileExit 。
(6) 为 Form1 类增加 string 类型变量记录当前编辑的文件名: string s_FileName="" ,如果为
空,表示还未记录文件名, 即编辑的文件还没有名字。 当单击菜单项保存, 保存文件时,
必须请用户输入文件名。
(7) 为新建菜单项增加事件处理函数如下:
private void menuItemFileNew_Click( object sender, System.EventArgs e)
{
richTextBox1.Text="";// 或richTextBox1.Clear();
s_FileName="";// 新建文件没有文件名。
}
(8) 为打开文件菜单项增加事件处理函数如下:
private void menuItemFileOpen_Click( object sender, System.EventArgs e)
{
if (openFileDialog1.ShowDialog()==DialogResult.OK)
{
s_FileName=openFileDialog1.FileName;
richTextBox1.LoadFile(openFileDialog1.FileName,RichTextBoxStreamType.PlainText);
}
}
(9) 为另存为菜单项增加事件处理函数如下:
private void menuItemFileSaveAs_Click( object sender, System.EventArgs e)
{
if (saveFileDialog1.ShowDialog()==DialogResult.OK)
{
s_FileName=saveFileDialog1.FileName;
richTextBox1.SaveFile(saveFileDialog1.FileName,RichTextBoxStreamType.PlainText);
}// 注意存取文件类型应一致。
}
(10)为保存文件菜单项增加事件处理处理函数如下:
private void menuItemSaveFile_Click( object sender, System.EventArgs e)
{
if (s_FileName.Length!=0)
richTextBox1.SaveFile(s_FileName,RichTextBoxStreamType.PlainText);
else
menuItemFileSaveAs_Click(sender,e);// 调用另存为菜单项事件处理函数
}
(11)把 SaveFileDialog 控件放到窗体中,将自动创建控件对象,其生命周期等于窗体生命周
期,将长期占用存储空间。实际上 SaveFileDialog 控件对象只在存文件菜单项事件处理
函数中有用,其它时间无用。为了节约存储空间,可以在存文件菜单项事件处理函数中
建立 SaveFileDialog 控件对象,退出该事件处理函数时,自动释放该对象。修改另存为
菜单项事件处理函数如下 (首先删除增加的控件 SaveFileDialog) :
private void menuItemFileSaveAs_Click( object sender, System.EventArgs e)
{
SaveFileDialog saveFileDialog1= new SaveFileDialog();
saveFileDialog1.Filter=" 纯文本文件 (*.txt)|*.txt| 所有文件 (*.*)|*.*";
saveFileDialog1.FilterIndex=1;
if (saveFileDialog1.ShowDialog()==DialogResult.OK)
{
s_FileName=saveFileDialog1.FileName;
richTextBox1.SaveFile(saveFileDialog1.FileName,
RichTextBoxStreamType.PlainText);
}// 也可以用此方法修改 打开文件菜单项事件处理函数 。
}
(12)为退出菜单项增加事件处理函数如下:
private void menuItemExit_Click( object sender, System.EventArgs e)
{ Close();}
(13)编译,运行,可以存取文件。