张光荣的正能量 [机械软件...改革利剑...向着改变世界...]

博客园 首页 新随笔 联系 订阅 管理

功能:

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

注:本人使用过程中暂未发现造成存取不正确的问题

 

posted on 2021-05-11 16:54  张光荣的正能量  阅读(117)  评论(0)    收藏  举报