2011-01-08 10 views
1

ユーザーがrichTextboxにテキストを書き込むときに、richTextBoxから最後の3文字を取得する必要があります。ユーザー入力時に最後の3文字を取得する

拡張WPFツールキットのrichTextBoxのTextプロパティにプロパティをバインドします。

私は.NETの反応拡張受信(Rx)を使用してプロパティにオブザーバーを作る
public string RtbText 
{ 
    get { return _rtbText; } 
    set 
    { 
     _rtbText = value; 
     NotifyPropertyChanged("RtbText"); 
    } 
} 

RtbText

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); 
     } 
    } 

しかし、私は、リッチテキストボックスに入力して開始した場合、私はこの例外を取得:

インデックスと長さは文字列内の場所を参照する必要があります。
パラメータ名:長さSystem.String.Substring(のInt32のstartIndex、のInt32長)WpfApplication1.MainWindow.GetLastThreeCharsで
(AT System.String.InternalSubStringWithChecks(のInt32のstartIndex、のInt32長、ブールfAlwaysCopy)

Pokec_Messenger \ ver.beta \ IoC.Get \ Pokec_Messenger \ ver.beta \ Pokec_ Messenger \ WpfApplication1 \ MainWindow.xaml.cs:行97
at System.Linq.Observable。 <> c
_DisplayClass389`1。 <> C_ DisplayClass38b.bその後、 _388(TSOURCE x)から

答えて

1

これは別の形式です。どのエンド

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

多分text.Lengthまでのいくつかの開始位置からのすべての文字を取得します - 2.未テスト

2

text.Length > 3場合(それが4だと言う):

text.Length - 2 = 2 

ですから、コードがあるなら:

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

この部分文字列内にの4文字の文字を要求すると失敗し、範囲外になります。

String.Substring Method (Int32, Int32)

このインスタンスから部分文字列を取得します。部分文字列は指定された文字位置から始まり、の長さがと指定されています。

また、テストと開始位置が正しくありません。 C#の配列と文字列はインデックスがゼロであることを忘れないでください。厳密に3を超える長さの場合をチェックすると、文字列全体を返すときにユーザーが正確に3文字を入力したときには、そのケースを見逃してしまいます。

あなたのコードはする必要があります:

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

あなたは長さを指定する必要はありません事実場合:

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

は、文字列の最後の3つの文字が返されます。

関連する問題