在用户输入期间获取最后3个字符

时间:2011-01-08 15:06:01

标签: wpf string richtextbox system.reactive

当用户在richTextbox中写入一些文本时,我需要从richTextBox获取最后三个字符。

我从Extended WPF工具包中绑定了richTextBox的Text属性上的属性。

public string RtbText
{
    get { return _rtbText; }
    set
    {
        _rtbText = value;
        NotifyPropertyChanged("RtbText");
    }
}

我使用Reactive Extensions for .NET(Rx)并在属性RtbText上生成Observer

    Observable.FromEvent<PropertyChangedEventArgs>(this, "PropertyChanged")
        .Where(e => e.EventArgs.PropertyName == "RtbText")
        .Select(_ => this.RtbText)
        .Where(text => text.Length > 1)
        .Do(AddSmiles)
        .Throttle(TimeSpan.FromSeconds(1))
        .Subscribe(GetLastThreeChars);

   private void GetLastThreeChars(string text)
   {
       if (text.Length > 3)
       {
           string lastThreeChars = text.Substring(text.Length - 2, text.Length);
       }
   }

但是如果我开始输入richTextBox,我会得到这个例外:

  

索引和长度必须指代字符串中的位置   参数名称:长度

     

在System.String.InternalSubStringWithChecks(Int32 startIndex,Int32 length,Boolean fAlwaysCopy)
     在System.String.Substring(Int32 startIndex,Int32 length)
     在C:\ Users \ Jan \ Documents \ Visual Studio 2010 \ Projects \ C#\ Pokec_Messenger \ ver.beta \ IoC.Get \ Pokec_Messenger \ ver.beta \ Pokec_ Messenger \中的WpfApplication1.MainWindow.GetLastThreeChars(字符串文本) WpfApplication1 \ MainWindow.xaml.cs:第97行      在System.Linq.Observable。&lt;&gt; c _DisplayClass389`1。&lt;&gt; c_ DisplayClass38b.b _388(TSource x)

2 个答案:

答案 0 :(得分:2)

如果text.Length > 3(说它是4)那么:

text.Length - 2 = 2

所以你的代码是:

string lastThreeChars = text.Substring(2, 4);

这会失败,因为您要求子字符串中的四个字符,这会使其超出范围。

String.Substring Method (Int32, Int32)

  

从此实例中检索子字符串。子字符串从指定的字符位置开始,并具有指定的长度

此外,您的测试和起始位置不正确。不要忘记C#数组和字符串是零索引的。检查长度严格大于3的情况,如果用户在要返回整个字符串时输入正好三个字符,则会错过这种情况。

您的代码必须是:

if (text.Length > 2)
{
    string lastThreeChars = text.Substring(text.Length - 3, 3);
}

如果您不需要指定长度:

if (text.Length > 2)
{
    string lastThreeChars = text.Substring(text.Length - 3);
}

将返回字符串中的最后三个字符。

答案 1 :(得分:1)

这是另一种形式。从一些开始位置直到结尾的所有角色

string lastThreeChars = text.Substring(text.Length - 3);

也许是text.Length - 2.未经测试