從整篇文字裡面查找某一個指定字串是文字編輯器的基本功能,在Windows系統裡面FindTextDialog常常也被視為基本的通用對話盒而由系統或SDK所提供。但在.NET裡的Toolbox裡面沒有提供這樣的元件,底下以最容易的方式實作了一個FindTextDlg所必備的最基本功能。包含:
- 基本的從文本搜尋指定字串(Find Text)
- 往上或往下查找(Foreward or Backward)
- 查找符合大小寫的字串(Match Case)
- 查找符合完整字串(Match Whole Word)
首先第一步,建立一個用來作為FindTextDlg的Form,這是按照如上所列出可以滿足一般的需求功能而建立的一個Form,如下所示。
FindTextDlg顯示的方式是以Modaless的形式顯示出來的,所以可以在FindTextDlg出現時同時又切換Focus到其它地方繼續其它操作。依照慣例,當使用者按下Ctrl+F時,FindTextDlg會顯示出來。或者當使用者按下F3時,會繼續從當前位置繼續往下(或往上)杳找指定字串。假如當使用者按下F3時FindTextDlg是Hide的狀態的話,那它的執行動作就相當於按下Ctrl+F。
許多編輯器支援可以開啟多個文件作編輯,這時候FindTextDlg也可以只需要一個Instance。考慮到這點,FindTextDlg可以實作作Singleton型式。當然,是否如此實作需視實際實求。
private void richTextBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.F)
FindTextDlg.ShowFindTextDlg();
else if (e.KeyCode == Keys.F3)
FindTextDlg.Search();
}
如上,當在文字編輯器裡按下Ctrl+F或F3時,分別呼叫FindTextDlg的ShowFindTextDlg或Search。
static FindTextDlg Instance = null;
static public void ShowFindTextDlg()
{
if (null == Instance)
Instance = new FindTextDlg();
Instance.Show();
Instance.cbFindStr.SelectAll();
Instance.cbFindStr.Focus();
}
static public void Search()
{
if (null == Instance)
{
ShowFindTextDlg();
return;
}
}
接下來的重點就是如何實作Search的功能。
基本的查找功能,我們可以由String.IndexOf(string value)得到。如果加上要由當得或指定文件位置開始查找則可以由String.IndexOf(string value, int startIndex)得到。如果要再加上是否檢查大小寫則可以由String.IndexOf(string value, StringComparison comparisonType)得到。至於要往前查找,則只需要使用對應的String.LastIndexOf版本即可。
其它細節可參考範例程式。