2012-04-17 31 views
0

我如何在richTextBox中实现类似过滤器(例如与combobox连接),只负责显示包含选定单词(过滤器)的行?带文本过滤功能的RichTextBox

我不是在说删除其他行 - 只有“隐藏”。

可能吗?

最终我可以使用另一个类型控件,但如果它不是必需的,我想使用richTextBox。

我现在想到,关于在某些结构中存储数据,并基于这个使用的结构进行过滤。但不知道它是否是有效的解决方案。

回答

1

尽量让这样的事情

public string[] RtbFullText; 

    private void button7_Click(object sender, EventArgs e) 
    { 
     RtbFullText = richTextBox1.Text.Split('\n'); 
    } 

    private void button8_Click(object sender, EventArgs e) 
    { 
     //Filter 
     richTextBox1.Text = ""; 
     foreach (string _s in RtbFullText) 
     { 
      if (_s.Contains("Filter")) 
       richTextBox1.Text += _s + "\n"; 
     } 
    } 
+0

所有时间你可以返回RtbFullText到richTextBox1.Text – Likurg 2012-04-17 09:59:52

+0

好的解决方案,但我忘了提及,richtextbox内容仍在改变(添加)。所以这个解决方案变得更加复杂。 – Saint 2012-04-17 10:10:24

+0

看看我的另一个答案 – Likurg 2012-04-17 11:32:59

1

这样你就可以做到这一点

public class NewRichTextBox : RichTextBox 
{ 
    public string[] TotalText; 
    private bool filter = false; 
    protected override void OnTextChanged(EventArgs e) 
    { 
     base.OnTextChanged(e); 
     if (!filter) 
      TotalText = Text.Split('\n'); 
    } 
    public void Filter(string sf) 
    { 
     filter = true; 
     Text = ""; 
     foreach (string _s in TotalText) 
     { 
      if (_s.Contains(sf)) 
       Text += _s + "\n"; 
     } 
     filter = false; 
    } 
} 

    public Form1() 
    { 
     InitializeComponent(); 
     NewRichTextBox myrtb = new NewRichTextBox(); 
     myrtb.Name = "NRTB"; 
     Controls.Add(myrtb); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     NewRichTextBox mtrb = (NewRichTextBox)Controls.Find("NRTB", false)[0]; 
     mtrb.Filter("Filter"); 
    } 
+0

它仍然很好,但是这些变化(新行)很常见(在1秒内〜10行),所以效率不高。 我想更好的方法将绑定richtextbox一些可观察的集合,但我找不到任何方式来做到这一点。 您对此有何看法? – Saint 2012-04-18 09:19:05

+0

您是否需要更改该集合中的文本,或者您想要查看它? – Likurg 2012-04-18 09:32:57

+0

两者。添加新行并在rtb中显示 – Saint 2012-04-18 09:57:37

1

OMG我做到这一点,使用这个类:

public class ListWithRTB : IList 
    { 
     private List<string> _contents = new List<string>(); 
     private int _count; 
     string lastsearch = ""; 

     public ListWithRTB() 
     { 
      _count = 0; 
     } 

     public object rtb; 

     private void UpdateRtb(string search) 
     { 
      lastsearch = search; 
      if (rtb is RichTextBox) 
      { 
       ((RichTextBox)rtb).Text = ""; 
       List<string> help_contents; 
       if (search != "") 
        help_contents = _contents.Where(s => s.Contains(search)).ToList(); 
       else 
        help_contents = _contents; 
       for (int i = 0; i < help_contents.Count; i++) 
       { 
        ((RichTextBox)rtb).Text += help_contents[i] + "\n"; 
       } 
      } 
     } 

     public void Filter(string search) 
     { 
      UpdateRtb(search); 
     } 

     public int Add(object value) 
     { 
      if (_count < _contents.Count + 1) 
      { 
       _contents.Add((string)value); 
       _count++; 
       UpdateRtb(lastsearch); 
       return (_count); 
      } 
      else 
      { 
       return -1; 
      } 
     } 

     public void RemoveAt(int index) 
     { 
      _contents.RemoveAt(index); 
      _count--; 
      UpdateRtb(lastsearch); 
     } 

     public void Clear() 
     { 
      _contents.Clear(); 
      UpdateRtb(lastsearch); 
      _count = 0; 
     } 

     public bool Contains(object value) 
     { 
      return _contents.Contains((string)value); 
     } 

     public int IndexOf(object value) 
     { 
      return _contents.IndexOf((string)value); 
     } 

     public void Insert(int index, object value) 
     { 
      _contents.Insert(index,(string) value); 
      _count++; 
     } 

     public bool IsFixedSize 
     { 
      get 
      { 
       return false; 
      } 
     } 

     public bool IsReadOnly 
     { 
      get 
      { 
       return false; 
      } 
     } 

     public void Remove(object value) 
     { 
      RemoveAt(IndexOf(value)); 
     } 

     public object this[int index] 
     { 
      get 
      { 
       return _contents[index]; 
      } 
      set 
      { 
       _contents[index] = value.ToString(); 
      } 
     } 

     public void CopyTo(Array array, int index) 
     { 
      int j = index; 
      for (int i = 0; i < Count; i++) 
      { 
       array.SetValue(_contents[i], j); 
       j++; 
      } 
     } 

     public int Count 
     { 
      get 
      { 
       return _count; 
      } 
     } 

     public bool IsSynchronized 
     { 
      get 
      { 
       return false; 
      } 
     } 

     public object SyncRoot 
     { 
      get 
      { 
       return this; 
      } 
     } 

     public IEnumerator GetEnumerator() 
     { 
      throw new Exception("The method or operation is not implemented."); 
     } 

     public void PrintContents() 
     { 
      Console.WriteLine("List has a capacity of {0} and currently has {1} elements.", _contents.Count, _count); 
      Console.Write("List contents:"); 
      for (int i = 0; i < Count; i++) 
      { 
       Console.Write(" {0}", _contents[i]); 
      } 
      Console.WriteLine(); 
     } 

    } 

这怎么可以使用它

ListWithRTB _mlrtb = new ListWithRTB(); 

    private void button1_Click(object sender, EventArgs e) 
    { 
     _mlrtb.rtb = richTextBox1; 
     _mlrtb.Add("Filter"); 
     _mlrtb.Add("123"); 
     _mlrtb.Add("111 Filter"); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     _mlrtb.Filter("Filter"); 
    } 

    private void button3_Click(object sender, EventArgs e) 
    { 
     _mlrtb.Filter(""); 
    } 
0
private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     if (!string.IsNullOrEmpty(SearchableString) && !string.IsNullOrEmpty(FullRichtxt)) 
     { 
      var SplitedTxt = FullRichtxt.Split('\n').ToList<string>(); 
      List<string> filterlist = SplitedTxt.Where(x => x.Contains(contx.SearchableString)).ToList<string>(); 
      string FilterString=string.Empty; 
      foreach(string str in filterlist) 
      { 
       FilterString+=str+"\n"; 
      } 
      (RichTextBox1 as RichTextBox).AppendText(FilterString); 
     } 
    }