功能:
1.查找出文本中的所有字符串
2.并将存在匹配字符串的行 列表至 ListBox 中
3.点击 ListBox 中的行,则会高亮显示行中可匹配的 字符串
缺点:
1.其将会一次性查找出所有存在匹配的字符串的文本行
2.未加入线程,速度较慢
public class SchAller
{
#region
#region par
Color fntClr;
Color bakClr;
Color sltClr = Color.Pink;
Color sltBakClr = Color.Azure;
int schLen, txtLen;
int linLen, mchIdx;
string sch = "";
string lin,txt;
int idx,lini, nxt;
ListBox lb=null;
RichTextBox rtb;
int mchIdxCnt = 0;
List<int> mchIdxL = new List<int>();
List<int> mchLinL = new List<int>();
#endregion
#region
/// <summary>
///
/// </summary>
/// <param name="sltClr">选中前景色</param>
/// <param name="sltBakClr">选中背景色</param>
public SchAller(Color sltClr, Color sltBakClr)
{
this.sltClr = sltClr;
this.sltBakClr = sltBakClr;
}
/// <summary>
/// 查询出全部,并将存在匹配字符的行文本保存至列表框
/// </summary>
/// <param name="rtb"></param>
/// <param name="sch">要查询的字符串</param>
/// <param name="lb_mchedLin">保存存在匹配字符串的行文本</param>
public void SchAll(RichTextBox rtb, string sch, ref ListBox lb_mchedLin)
{
IniClr(rtb, lb_mchedLin, sch);
SchAll(rtb, ref lb_mchedLin);
}
#endregion
#region
private void IniClr(RichTextBox rtb, ListBox lb_mchedLin, string sch)
{
if (sch == "")
return;
if (sch != this.sch || rtb.TextLength != txtLen)
BakSltClr(rtb);
else if (this.rtb.Name != rtb.Name)
BakSltClr(this.rtb);
else if (rtb.Text != txt)
BakSltClr(rtb);
else if (this.sch == sch)
return;
if (lb != lb_mchedLin)
{
if (lb != null)
lb.MouseDoubleClick -= Lb_mchedLin_MouseDoubleClick;
lb_mchedLin.MouseDoubleClick += Lb_mchedLin_MouseDoubleClick;
}
this.rtb = rtb;
this.sch = sch;
mchIdxL.Clear();
mchIdxCnt = 0;
txt = rtb.Text;
txtLen = rtb.TextLength;
schLen = sch.Length;
linLen = rtb.Lines.Length;
fntClr = rtb.ForeColor;
bakClr = rtb.BackColor;
rtb.SelectionBackColor = sltBakClr;
rtb.SelectionColor = sltClr;
}
/// <summary>
/// 还原之前选中的项字色
/// </summary>
public void BakSltClr()
{
BakSltClr(this.rtb);
}
/// <summary>
/// 还原之前选中的项字色
/// </summary>
/// <param name="rtb"></param>
private void BakSltClr(RichTextBox rtb)
{
if (mchIdxCnt < 1)
return;
for (int i = 0; i < mchIdxCnt; i++)
{
mchIdx = mchIdxL[i];
rtb.Select(mchIdx, schLen);
rtb.SelectionBackColor = bakClr;
rtb.SelectionColor = fntClr;
}
rtb.Select(0, 0);
mchLinL.Clear();
mchIdxL.Clear();
mchIdxCnt = 0;
}
private void SchAll(RichTextBox rtb, ref ListBox lb_mchedLin)
{
lb_mchedLin.Items.Clear();
for (int i = 0; i < linLen; i++)
{
lin = rtb.Lines[i];
if (lin == "")
continue;
if (lin.Length < schLen)
continue;
idx = lin.IndexOf(sch);
if (idx < 0)
continue;
lb_mchedLin.Items.Add(lin);
mchLinL.Add(i);
}
}
private void Lb_mchedLin_MouseDoubleClick(object sender, MouseEventArgs e)
{
lb = sender as ListBox;
idx = lb.SelectedIndex;
if (idx < 0)
return;
idx = mchLinL[idx];
//lini = rtb.GetFirstCharIndexFromLine(idx);
lini = LinIdx(rtb, idx);
lin = rtb.Lines[idx];
nxt = lin.IndexOf(sch);
idx = lini + nxt;
rtb.Select(idx, schLen);
rtb.ScrollToCaret();
rtb.SelectionBackColor = sltBakClr;
rtb.SelectionColor = sltClr;
mchIdxCnt++;
mchIdxL.Add(idx);
while (nxt > 0)
{
nxt += schLen;
nxt = lin.IndexOf(sch, nxt);
if (nxt > -1)
{
idx = lini + nxt;
rtb.Select(idx, schLen);
rtb.ScrollToCaret();
rtb.SelectionBackColor = sltBakClr;
rtb.SelectionColor = sltClr;
mchIdxCnt++;
mchIdxL.Add(idx);
}
}
}
private int LinIdx(RichTextBox rtb,int idx)
{
int linIdx = 0;
for(int i=0;i< idx; i++)
{
lin = rtb.Lines[i];
linIdx += lin.Length + 1;//\n
}
return linIdx;
}
#endregion
#endregion
}
交流 QQ : 2412366909@qq.com
手机号码:177-7499-4428
注:本人使用过程中暂未发现造成存取不正确的问题
浙公网安备 33010602011771号