当用户在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)
答案 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.未经测试