C# - 插入表情符号RichTextBox中插入一些,而忽略其他人 [英] c# - inserting smileys in RichTextBox inserts some and ignores others

查看:299
本文介绍了C# - 插入表情符号RichTextBox中插入一些,而忽略其他人的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个代码,在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 for addin.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 of Contains.

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆