- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
主要目标是让用户在所有其他选定的单词或短语中将一个选项识别为当前选项。
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
if (results.Count > 0)
{
richTextBox1.SelectionStart = results[(int)numericUpDown1.Value - 1];
richTextBox1.SelectionLength = textBox1.Text.Length;
richTextBox1.SelectionColor = Color.Red;
richTextBox1.ScrollToCaret();
}
}
在这种情况下,在截图中,有3个搜索词的结果:System
。所有结果都显示为黄色。
如果我将 NumericUpDown 值更改为 2,它会将结果中的第二个 System
单词着色为红色,然后当将 NumericUpDown 值更改为 3 时,它将最后一个系统结果着色为红色也。
我的问题是 2 和 3 都将显示为红色:我只希望当前选择的单词显示为红色,所有其他匹配应使用默认颜色。
最佳答案
一些有助于构建可处理文本选择的类对象的建议。
此类应包含大部分(或全部)在给定文本中搜索关键字所需的逻辑,维护找到的匹配列表、它们的位置和长度,并允许对该列表进行基本导航匹配项,以及其他可以轻松扩展功能的配置。
在这里,TextSearcher
1 类构造函数需要一个 RichTextBox 控件作为参数之一,加上一个用于正常选择的颜色和一个用于突出显示当前选择的颜色当匹配列表被导航时匹配。
▶ 搜索功能由 Regex.Matches() 处理方法,返回 MatchCollection的 Match对象,非常方便,因为每个 Match
都包含匹配项在文本中的位置(Index
属性)及其长度(Length
属性)。
▶ 导航功能由 BindingSource 提供目的。它的 DataSource
属性设置为 Regex.Matches()
返回的 MatchCollection
并且每次搜索一组新的关键字时它都会重置。< br/>此类在初始化时提供 MoveNext()
、MovePrevious()
、 MoveLast()
和 MoveFirst()
方法,加上一个 Position
属性,它标识集合中当前对象的索引 - 此处为 Match
对象。
▶ CaseSensite
属性用于执行区分大小写或不区分大小写的搜索。添加是为了表明可以很简单地使用基于现有功能构建的更多功能来扩展基本功能(例如,文化敏感/不敏感搜索)。
要初始化 TextSearcher 类,将 RichTextBox 控件的实例和两个 Color 值传递给它的构造函数:
TextSearcher matchFinder = null;
public SomeForm()
{
InitializeComponent();
matchFinder = new TextSearcher(richTextBox1, Color.Yellow, Color.Red);
}
在示例中,您可以看到四个控件:
btnPrevious
) 和下一个 (btnNext
) 按钮,用于导航匹配列表。nudGotoMatch
),用于跳转到特定的匹配键。txtSearch
),用于输入一个或多个关键字,由竖线分隔(竖线字符用于指定 Regex 中的备用匹配项,它可以替换为其他内容界面)。由于 TextSearcher
类包含所有搜索和导航逻辑,因此在前端激活这些控件功能所需的代码很少,只需满足标准 UI 要求(例如设置 e.SuppressKeyPress = true
当在 TextBox 控件中按下 Enter 键时)。
private void txtSearch_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter) {
string keywords = (sender as Control).Text;
e.SuppressKeyPress = true;
if (!matchFinder.CurrentKeywords.Equals(keyword)) {
nudGotoMatch.Maximum = matchFinder.Search(keywords);
}
}
}
private void nudGotoMatch_ValueChanged(object sender, EventArgs e)
{
if (matchFinder.Matches.Count > 0) {
matchFinder.GotoMatch((int)nudGotoMatch.Value - 1);
}
}
private void btnPrevious_Click(object sender, EventArgs e)
{
matchFinder.PreviousMatch();
}
private void btnNext_Click(object sender, EventArgs e)
{
matchFinder.NextMatch();
}
它是这样工作的:
TextSearcher
类:
using System.Collections.Generic;
using System.Drawing;
using System.Text.RegularExpressions;
using System.Windows.Forms;
private class TextSearcher
{
private BindingSource m_bsMatches = null;
private RichTextBox m_Rtb = null;
public TextSearcher(RichTextBox rtb) : this(rtb, Color.Yellow, Color.Red) { }
public TextSearcher(RichTextBox rtb, Color selectionColor, Color currentColor)
{
m_Rtb = rtb;
SelectionColor = selectionColor;
CurrentColor = currentColor;
}
public string CurrentKeywords { get; private set; } = string.Empty;
public bool CaseSensitive { get; set; } = true;
public int CurrentIndex => m_bsMatches.Position;
public Match CurrentMatch => (Match)m_bsMatches.Current;
public MatchCollection Matches { get; private set; }
public Color SelectionColor { get; set; }
public Color CurrentColor { get; set; }
public void GotoMatch(int position)
{
SelectText(false);
m_bsMatches.Position = Math.Max(Math.Min(m_bsMatches.Count, position), 0);
SelectText(true);
}
public void NextMatch()
{
SelectText(false);
if (m_bsMatches != null && m_bsMatches.Position == m_bsMatches.Count - 1) {
m_bsMatches.MoveFirst();
}
else { m_bsMatches.MoveNext(); }
SelectText(true);
}
public void PreviousMatch()
{
SelectText(false);
if (m_bsMatches != null && m_bsMatches.Position > 0) {
m_bsMatches.MovePrevious();
}
else { m_bsMatches.MoveLast(); }
SelectText(true);
}
public int Search(string keywords)
{
if (CurrentKeywords.Equals(keywords)) return Matches.Count;
m_bsMatches?.Dispose();
CurrentKeywords = keywords;
var options = RegexOptions.Multiline |
(CaseSensitive ? RegexOptions.IgnoreCase : RegexOptions.None);
Matches = Regex.Matches(m_Rtb.Text, keywords, options);
if (Matches != null) {
m_Rtb.SelectAll();
m_Rtb.SelectionColor = m_Rtb.ForeColor;
m_Rtb.SelectionStart = 0;
m_bsMatches = new BindingSource(Matches, null);
SelectKeywords();
return Matches.Count;
}
return 0;
}
private void SelectKeywords()
{
foreach (Match m in Matches) {
SelectText(false);
NextMatch();
}
m_bsMatches.MoveFirst();
}
private void SelectText(bool current)
{
m_Rtb.Select(CurrentMatch.Index, CurrentMatch.Length);
m_Rtb.SelectionColor = current ? CurrentColor : SelectionColor;
}
}
1 - 我知道,好名字!我花了一段时间才想到它,所以请不要更改它:)
关于c# - 如何突出显示具有不同于 RichTextBox 文本中所有其他选择的颜色的单词或短语?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62009599/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!