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)編譯,運行,可以存取文件。