文本搜索工具之显示
这个小工具纯粹是学习练手用的,好多地方考虑不周还望海涵,有好的建议还望指教,谢谢。
左侧用的是ListBox控件,而右侧用的则是richTextBox控件,第一步实现点击左侧相应的列在右边显示对应的文件内容,并将关键字高亮显示。
1 Encoding encode = Encoding.Default;//这里定义了一个全局的Encoding变量,为后面更改编码时使用 2 private void listBox1_Click(object sender, EventArgs e) 3 { 4 if (listBox1.Items.Count == 0) 5 return; 6 //获取选中项中保存的文件地址 7 string filename = listBox1.SelectedItem.ToString(); 8 //通过File类的ReadAllText方法将文件中的文本读取出来 9 string content = File.ReadAllText(filename, encode); 10 //将文本内容显示在richTextBox1上 11 richTextBox1.Clear(); 12 richTextBox1.Text = content; 13 //使用正则表达式找出正文中的匹配关键字的Match集合 14 MatchCollection mc = Regex.Matches(content, txtKeys.Text); 15 16 foreach (Match m in mc) 17 { 18 int pos = 0;//定位richTextBox中匹配到的关键字的起始位置 19 while (pos < richTextBox1.Text.Length) 20 { 21 if (m.Success) 22 { 23 //使用richTextBox控件的Find方法查找关键字在文本中的位置,并将起始位置更新 24 pos = richTextBox1.Find(m.Value, pos, richTextBox1.Text.Length, RichTextBoxFinds.None); 25 if (pos == -1) 26 { 27 //如果返回的是-1,说明没有找到,则退出 28 break; 29 } 30 else 31 { 32 //将查找的起始位置更新为加上关键字的长度,也就是从关键字之后再开始查找 33 pos += m.Value.Length; 34 } 35 if (richTextBox1.SelectedText.Length > 0) 36 { 37 //接下来就是将查找到的关键字高亮显示为特定的颜色,这里用灰色 38 richTextBox1.SelectionBackColor = Color.Gray; 39 } 40 } 41 } 42 } 43 }
现在我们已经可以搜索到内容并且显示出来了,但这样看着不爽,我就想在原文件中用系统的默认程序打开该文件,或者直接打开该文件的存放目录岂不是更好,这里我用一个右键菜单contextMenuStrip1控件,但是在右键的时候右键位置的选中有一点问题,默认选中是在单击的时候,网上找了一下,这里的解决方法是在listBox1_MouseDown事件中判断是右键点击的就启动右键菜单,当然有更好的方法可以告诉我,呵呵,先谢谢了。
1 //ListBox右键单击 2 string contextMenuStr = string.Empty;//用来存放右键时选中项的文件地址 3 private void listBox1_MouseDown(object sender, MouseEventArgs e) 4 { 5 //判断是鼠标右键 6 if (e.Button == MouseButtons.Right) 7 { 8 //通过鼠标位置获取点击项的索引 9 int index = listBox1.IndexFromPoint(e.X, e.Y); 10 if (index >= 0) 11 { 12 //将选中项设为点击到的项 13 listBox1.SelectedIndex = index; 14 //将文件地址保存 15 contextMenuStr = listBox1.Items[index].ToString(); 16 //指定右键菜单 17 listBox1.ContextMenuStrip = contextMenuStrip1; 18 } 19 } 20 }
然后,在右键菜单中添加菜单项,这里有“复制到剪贴板”,“打开文件目录”和“打开文件”,代码如下:
1 //复制文件名到剪贴板 2 private void 复制文件全名ToolStripMenuItem_Click(object sender, EventArgs e) 3 { 4 Clipboard.SetData(DataFormats.Text, contextMenuStr); 5 } 6 //通过资源管理器打开文件所在的目录 7 private void 打开文件目录ToolStripMenuItem_Click(object sender, EventArgs e) 8 { 9 string filePath = contextMenuStr; 10 System.Diagnostics.Process.Start("Explorer", "/select," + filePath); 11 } 12 //将文件打开 13 private void 打开文件ToolStripMenuItem_Click(object sender, EventArgs e) 14 { 15 string filePath = contextMenuStr; 16 System.Diagnostics.Process.Start(filePath); 17 }
这时就可以在文件夹中打开找到的文件了。