C# - 插入表情符号RichTextBox中插入一些,而忽略其他人 [英] c# - inserting smileys in RichTextBox inserts some and ignores others
问题描述
我有一个代码,在RichTextBox到笑脸代替的符号,这是代码:
私人无效add_smileys(RichTextBox的插件)
{
试
{
,而(addin.Text.Contains(:)))
{
addin.SelectionStart =插件。查找(:),RichTextBoxFinds.WholeWord);
addin.SelectionLength = 2;
图片IMG = Resources.in_smile;
Clipboard.SetImage(IMG);
addin.Paste();
}
,而(addin.Text.Contains(> :())
{
addin.SelectionStart = addin.Find(> :(,RichTextBoxFinds .WholeWord);
addin.SelectionLength = 3;
图片IMG = Resources.in_angry;
Clipboard.SetImage(IMG);
addin.Paste();
}
,而(addin.Text.Contains(:D))
{
addin.SelectionStart = addin.Find(:D,RichTextBoxFinds.WholeWord);
addin.SelectionLength = 2;
图片IMG = Resources.in_lol;
Clipboard.SetImage(IMG);
addin.Paste();
}
,而(addin.Text.Contains(:())
{
addin.SelectionStart = addin.Find(:(RichTextBoxFinds.WholeWord);
addin.SelectionLength = 3;
图片IMG = Resources.in_cry;
Clipboard.SetImage(IMG);
addin.Paste();
}
,而(addin.Text.Contains(:())
{
addin.SelectionStart = addin.Find(:(,RichTextBoxFinds.WholeWord);
addin.SelectionLength = 2;
图片IMG = Resources.in_sad;
Clipboard.SetImage(IMG);
addin.Paste();
}
,而(addin.Text.Contains(;)))
{
addin.SelectionStart = addin.Find(;),RichTextBoxFinds.WholeWord);
addin.SelectionLength = 2;
图片IMG = Resources.in_wink;
Clipboard.SetImage(IMG);
addin.Paste();
}
,而(addin.Text.Contains(的xD))
{
addin.SelectionStart = addin.Find(的xD,RichTextBoxFinds.WholeWord);
addin.SelectionLength = 2;
图片IMG = Resources.in_laugh;
Clipboard.SetImage(IMG);
addin.Paste();
}
,而(addin.Text.Contains(:P))
{
addin.SelectionStart = addin.Find(:P,RichTextBoxFinds.WholeWord);
addin.SelectionLength = 2;
图片IMG = Resources.in_tongue;
Clipboard.SetImage(IMG);
addin.Paste();
}
,而(addin.Text.Contains(:|))
{
addin.SelectionStart = addin.Find(:|,RichTextBoxFinds.WholeWord);
addin.SelectionLength = 2;
图片IMG = Resources.in_neutral;
Clipboard.SetImage(IMG);
addin.Paste();
}
,而(addin.Text.Contains(^^))
{
addin.SelectionStart = addin.Find(^^RichTextBoxFinds.WholeWord);
addin.SelectionLength = 2;
图片IMG = Resources.in_happy;
Clipboard.SetImage(IMG);
addin.Paste();
}
,而(addin.Text.Contains(o.O))
{
addin.SelectionStart = addin.Find(o.O,RichTextBoxFinds.WholeWord);
addin.SelectionLength = 3;
图片IMG = Resources.in_dizzy;
Clipboard.SetImage(IMG);
addin.Paste();
}
,而(addin.Text.Contains(:S))
{
addin.SelectionStart = addin.Find(:S,RichTextBoxFinds.WholeWord);
addin.SelectionLength = 2;
图片IMG = Resources.in_confused;
Clipboard.SetImage(IMG);
addin.Paste();
}
,而(addin.Text.Contains(:O))
{
addin.SelectionStart = addin.Find(:O,RichTextBoxFinds.WholeWord);
addin.SelectionLength = 2;
图片IMG = Resources.in_omg;
Clipboard.SetImage(IMG);
addin.Paste();
}
}
赶上(例外五)
{
MessageBox.Show(e.Message);
}
}
这是输出:
如你所见,有些符号用笑脸代替,有些则不是。而且,我得到这个异常:
什么是此错误的原因是什么? ?我该如何解决这个问题。
我得到这个异常:在这里输入的形象描述。
块引用>
什么是此错误的原因是什么?怎么解决呢?
块引用>
的
查找
方法的返回值1
时,它正在寻找不存在的字符串。此值不适用于addin.SelectionStart
。
您首先应该检查,保证了结果
查找
比1
之前尝试使用值法。
大VAR selectionStart = addin.Find(:),RichTextBoxFinds.WholeWord);
如果(selectionStart -1个)
{
addin.SelectionStart = selectionStart;
addin.SelectionLength = 2;
}
和您的包含搜索和检查是多余的。出于某种原因,当你到^^,他们正在返回不同的结果,这就是为什么你所得到的错误。但去除冗余,你应该使用
查找
方法在你的循环,而不是包含
。,而(真)
{
VAR selectionStart = addin.Find(:),RichTextBoxFinds.WholeWord);
如果(selectionStart -1个)
{
addin.SelectionStart = selectionStart;
addin.SelectionLength = 2;
}
,否则
{
中断;
}
}
我也觉得你的做法是不是很干净。你可以使用
词典<字符串,图片>
来完成所有的在一个更简单,更易于维护的方式取代的。你也应该使用@
符号逃脱你的字符串。私人无效add_smileys(RichTextBox的插件)
{
变种表情=新词典<字符串,图片>()
{
{@:),Resources.in_smile}
{@> :(,Resources.in_angry}
{@:D,Resources.in_lol}
{@:(Resources.in_cry}
{@:(,Resources.in_sad}
{@),Resources.in_wink}
{@的xD,Resources.in_laugh}
{@:P,Resources.in_tongue}
{@:|,Resources.in_neutral}
{@^^,Resources.in_happy}
{@ OO,Resources.in_dizzy}
{@:S,Resources.in_confused}
{@:O,Resources.in_omg}
};
的foreach(在笑脸笑脸VAR)
{
add_smiley(插件,smiley.Key,smiley.Value);
}
}
私人无效add_smiley(RichTextBox的插件,字符串标记,图像笑脸)
{
,而(真)
{
VAR selectionStart = addin.Find(令牌,RichTextBoxFinds.WholeWord) ;
如果(selectionStart℃下)突破;
试
{
addin.SelectionStart = selectionStart;
addin.SelectionLength = token.Length;
Clipboard.SetImage(笑脸);
addin.Paste();
}
赶上(异常前)
{
MessageBox.Show(e.Message);
中断;
}
}
}
I have a code to replace symbols in the richtextbox to smileys, this is the code:
private void add_smileys(RichTextBox addin) { try { while (addin.Text.Contains(":)")) { addin.SelectionStart = addin.Find(":)", RichTextBoxFinds.WholeWord); addin.SelectionLength = 2; Image img = Resources.in_smile; Clipboard.SetImage(img); addin.Paste(); } while (addin.Text.Contains(">:(")) { addin.SelectionStart = addin.Find(">:(", RichTextBoxFinds.WholeWord); addin.SelectionLength = 3; Image img = Resources.in_angry; Clipboard.SetImage(img); addin.Paste(); } while (addin.Text.Contains(":D")) { addin.SelectionStart = addin.Find(":D", RichTextBoxFinds.WholeWord); addin.SelectionLength = 2; Image img = Resources.in_lol; Clipboard.SetImage(img); addin.Paste(); } while (addin.Text.Contains(":'(")) { addin.SelectionStart = addin.Find(":'(", RichTextBoxFinds.WholeWord); addin.SelectionLength = 3; Image img = Resources.in_cry; Clipboard.SetImage(img); addin.Paste(); } while (addin.Text.Contains(":(")) { addin.SelectionStart = addin.Find(":(", RichTextBoxFinds.WholeWord); addin.SelectionLength = 2; Image img = Resources.in_sad; Clipboard.SetImage(img); addin.Paste(); } while (addin.Text.Contains(";)")) { addin.SelectionStart = addin.Find(";)", RichTextBoxFinds.WholeWord); addin.SelectionLength = 2; Image img = Resources.in_wink; Clipboard.SetImage(img); addin.Paste(); } while (addin.Text.Contains("xD")) { addin.SelectionStart = addin.Find("xD", RichTextBoxFinds.WholeWord); addin.SelectionLength = 2; Image img = Resources.in_laugh; Clipboard.SetImage(img); addin.Paste(); } while (addin.Text.Contains(":P")) { addin.SelectionStart = addin.Find(":P", RichTextBoxFinds.WholeWord); addin.SelectionLength = 2; Image img = Resources.in_tongue; Clipboard.SetImage(img); addin.Paste(); } while (addin.Text.Contains(":|")) { addin.SelectionStart = addin.Find(":|", RichTextBoxFinds.WholeWord); addin.SelectionLength = 2; Image img = Resources.in_neutral; Clipboard.SetImage(img); addin.Paste(); } while (addin.Text.Contains("^^")) { addin.SelectionStart = addin.Find("^^", RichTextBoxFinds.WholeWord); addin.SelectionLength = 2; Image img = Resources.in_happy; Clipboard.SetImage(img); addin.Paste(); } while (addin.Text.Contains("o.O")) { addin.SelectionStart = addin.Find("o.O", RichTextBoxFinds.WholeWord); addin.SelectionLength = 3; Image img = Resources.in_dizzy; Clipboard.SetImage(img); addin.Paste(); } while (addin.Text.Contains(":S")) { addin.SelectionStart = addin.Find(":S", RichTextBoxFinds.WholeWord); addin.SelectionLength = 2; Image img = Resources.in_confused; Clipboard.SetImage(img); addin.Paste(); } while (addin.Text.Contains(":O")) { addin.SelectionStart = addin.Find(":O", RichTextBoxFinds.WholeWord); addin.SelectionLength = 2; Image img = Resources.in_omg; Clipboard.SetImage(img); addin.Paste(); } } catch (Exception e) { MessageBox.Show(e.Message); } }
This is the output:
As you see, some symbols are replaced with smileys and some aren't. moreover, I get this exception:
What is the cause of this error? How do I fix it?
解决方案I get this exception: enter image description here
What is the cause of this error? and how do I fix it?
The
Find
method returns-1
when the string it is looking for doesn't exist. This value is not valid foraddin.SelectionStart
.You should first check to ensure the result of the
Find
is greater than-1
method before attempting to use the value.var selectionStart = addin.Find(":)", RichTextBoxFinds.WholeWord); if (selectionStart > -1) { addin.SelectionStart = selectionStart; addin.SelectionLength = 2; }
And your Contains and Find check are redundant. For some reason when you get to "^^" they are returning different results, which is why you are getting the error. But to remove the redundancy, you should use the
Find
method in your loop instead ofContains
.while (true) { var selectionStart = addin.Find(":)", RichTextBoxFinds.WholeWord); if (selectionStart > -1) { addin.SelectionStart = selectionStart; addin.SelectionLength = 2; } else { break; } }
I also think that your approach is not very clean. You could use a
Dictionary<string, Image>
to do all of your replacing in a simpler, more maintainable way. You should also use the@
symbol to escape your strings.private void add_smileys(RichTextBox addin) { var smileys = new Dictionary<string, Image>() { { @":)", Resources.in_smile }, { @">:(", Resources.in_angry }, { @":D", Resources.in_lol }, { @":'(", Resources.in_cry }, { @":(", Resources.in_sad }, { @";)", Resources.in_wink }, { @"xD", Resources.in_laugh }, { @":P", Resources.in_tongue }, { @":|", Resources.in_neutral }, { @"^^", Resources.in_happy }, { @"o.O", Resources.in_dizzy }, { @":S", Resources.in_confused }, { @":O", Resources.in_omg }, }; foreach (var smiley in smileys) { add_smiley(addin, smiley.Key, smiley.Value); } } private void add_smiley(RichTextBox addin, string token, Image smiley) { while (true) { var selectionStart = addin.Find(token, RichTextBoxFinds.WholeWord); if (selectionStart < 0) break; try { addin.SelectionStart = selectionStart; addin.SelectionLength = token.Length; Clipboard.SetImage(smiley); addin.Paste(); } catch (Exception ex) { MessageBox.Show(e.Message); break; } } }
这篇关于C# - 插入表情符号RichTextBox中插入一些,而忽略其他人的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!