c#-在RichTextBox中插入笑脸会插入一些笑脸,而忽略其他笑脸

c#-在RichTextBox中插入笑脸会插入一些笑脸,而忽略其他笑脸,c#,image,winforms,clipboard,C#,Image,Winforms,Clipboard,我有一个代码将richtextbox中的符号替换为smileys,代码如下: private void add_smileys(RichTextBox addin) { try { while (addin.Text.Contains(":)")) { addin.SelectionStart = addin.Find(":)",

我有一个代码将richtextbox中的符号替换为smileys,代码如下:

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);
            }
        }
这是输出:

如您所见,有些符号被笑脸取代,有些则没有。此外,我还有一个例外:

这个错误的原因是什么?我怎么修理它

我得到这个例外:在这里输入图像描述

这个错误的原因是什么?我该如何修复它

当查找的字符串不存在时,
Find
方法返回
-1
。此值对于
加载项选择Start
无效

在尝试使用该值之前,应首先检查以确保
Find
方法的结果大于
-1
方法

var selectionStart = addin.Find(":)", RichTextBoxFinds.WholeWord);
if (selectionStart > -1)
{
    addin.SelectionStart = selectionStart;
    addin.SelectionLength = 2;
}
您的包含和查找检查是多余的。由于某种原因,当您到达“^^”时,它们返回不同的结果,这就是为什么会出现错误。但是要删除冗余,应该在循环中使用
Find
方法,而不是
Contains

while (true)
{
    var selectionStart = addin.Find(":)", RichTextBoxFinds.WholeWord);
    if (selectionStart > -1)
    {
        addin.SelectionStart = selectionStart;
        addin.SelectionLength = 2;
    }
    else
    {
        break;
    }
}
我也认为你的方法不是很干净。您可以使用
字典
以更简单、更易于维护的方式进行所有替换。您还应该使用
@
符号来转义字符串

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;
        }
    }
}
private void add\u smileys(RichTextBox addin)
{
var smileys=新字典()
{
{@:“,Resources.in_smile},
{@“>:(“,Resources.in_},
{@“:D”,Resources.in_lol},
{@:“(”,Resources.in_cry},
{@:(,Resources.in_sad},
{@“)”,Resources.in_wink},
{@“xD”,参考资料,
{@“:P”,参考资料,
{@:|“,Resources.in_neutral},
{@“^”,Resources.in_happy},
{@“o.o”,参考资料,in_dizzy},
{@“:S”,参考资料,
{@“:O”,参考资料,
};
foreach(smileys中的变量smiley)
{
添加\u smiley(addin,smiley.Key,smiley.Value);
}
}
私有void add_smiley(RichTextBox加载项、字符串标记、图像smiley)
{
while(true)
{
var selectionStart=addin.Find(token,RichTextBoxFinds.WholeWord);
如果(选择开始<0)中断;
尝试
{
addin.SelectionStart=SelectionStart;
addin.SelectionLength=token.Length;
剪贴板.SetImage(smiley);
addin.Paste();
}
捕获(例外情况除外)
{
MessageBox.Show(e.Message);
打破
}
}
}

您似乎对while循环进行了大量冗余检查,为什么不创建一个
字符串[]{}
包含所有可能的字符串,然后实现一个while循环和可能的Case语句(如果需要)。乍一看,您可以使用一个while循环来实现这一点,而这个while循环可能不需要,但无论哪种方式,您都应该能够使用switch Case语句来完成相同的操作。您是否已使用ru代码以查看哪个while循环导致了问题..?以及为什么会发生..?@MethodMan显然,“xD”符号的while循环是导致问题的循环,我不知道为什么。我如何创建字符串[]while循环?我的意思是,我必须在addin.Text.Contains()中放入什么方法?无论如何,谢谢你花时间来帮助我:)我要说的是创建一个字符串[]类似这样的
var-validChars=new-string[]{:”,“>:(“,…};
”,然后检查是否包含任何字符,然后执行以下操作
var-containsChar=validChars.ToList().Contains(“:”);
下面的示例非常简单,可以创建一个字符串[]来检查..@MethodMan,但我希望validChars.ToList().Contains检查所有符号,而不仅仅是“:”)“@QNightOwl888非常好,我认为字典示例是一个很好的选择,也是OPC的一个很好的示例谢谢:)它现在可以工作了!但是,当应用程序解释了很多笑脸时,它会变得非常缓慢,有时会崩溃,对此我能做些什么呢?