我尝试使用以下代码在文本框中查找空(或空白)行,但我不知道如何在插入符号位置之前找到第一个newline
。我怎么解决这个问题?或者有更短的解决方案吗?
int i = textBox1.SelectionStart;
var endOfLine = textBox1.Text.IndexOf(Environment.NewLine,i);
/* the next line should find the first occurance
of newline before the i postion, which method does that? */
var beginOfLine = textBox1.Text.XXX(Environment.NewLine,i);
bool isEmpty = textBox1.Text.Substring(
beginOfLine,
endOfLine-beginofLine).Trim() == "";
答案 0 :(得分:1)
使用String.LastIndexOf
的重载来查找特定索引之前的字符串的最后一个索引。
http://msdn.microsoft.com/en-us/library/1tw91fa3(v=vs.110).aspx
您要查找的代码中的行将是:
var begin = textBox1.Text.LastIndexOf(Environment.NewLine,i);
答案 1 :(得分:1)
为了使一行为空,光标位置必须位于文本的开头,或者NewLine必须位于它之前,并且光标位置必须位于文本的末尾,或者必须后跟NewLine:< / p>
string s = textBox1.Text;
int i = textBox1.SelectionStart;
string start = s.Substring(0, i).TrimEnd(' ', '\t');
string end = s.Substring(i, s.Length - i).TrimStart(' ', '\t');
bool isEmpty = (start.Length == 0 || start.EndsWith(Environment.NewLine)) &&
(end.Length == 0 || end.StartsWith(Environment.NewLine));
为了处理空格和制表符,它们会从开头和结尾进行修剪。请注意,我明确指定了要修剪的字符,否则也会修剪CR和LF。请注意,有很多空格字符,请参阅Char.IsWhiteSpace Method。
答案 2 :(得分:1)
这是我的尝试,假设TextBox行结尾是\ r \ n。
private static bool IsCursorOnEmptyLine(TextBox targetTextBox)
{
var cursorPosition = targetTextBox.SelectionStart;
var positionBefore = targetTextBox.Text.LastIndexOf('\n', cursorPosition == 0 ? 0 : cursorPosition - 1);
var positionAfter = targetTextBox.Text.IndexOf('\r', cursorPosition);
if (positionBefore == -1) positionBefore = 0;
if (positionAfter == -1) positionAfter = targetTextBox.Text.Length;
return targetTextBox.Text.Substring(positionBefore, positionAfter - positionBefore).Trim() == "";
}
使用示例:
Debug.Print("Empty Line: " + (IsCursorOnEmptyLine(myTextBox) ? "Yes" : "No"));
答案 3 :(得分:0)
首先获取光标前的文字:
string textPriorToCursor = textBox1.Text.Substring(0, textBox1.Text.Length - i);
然后在光标之前的文本中最后一次出现新行:
var begin = textPriorToCursor.LastIndexOf(Environment.NewLine);
将上述两行合并为一行如下:
var begin = textBox1.Text.Substring(0, textBox1.Text.Length - i).LastIndexOf(Environment.NewLine);
答案 4 :(得分:0)
您可以检查插入符号所在的行,看看它是否为空:
if ((tBox.Lines.Length == 0 && tBox.Text.Trim() == "") ||
(tBox.Lines[tBox.GetLineFromCharIndex(tBox.SelectionStart)].Trim() == "")) {
// caret is on an empty line
}
答案 5 :(得分:0)
如果中间的字符串为空,那么在光标位置之前和之后找到NewLine的索引,那么该行为空,对于NewLine的索引为-1的第一行和最后一行,使用0和string.length到位他们
int i = textBox1.SelectionStart;
var s = textBox1.Text;
var start = s.LastIndexOf(Environment.NewLine, i);
var end = s.IndexOf(Environment.NewLine, i);
start = start >= 0 ? start : 0;
end = end >= 0 ? end : s.Length;
bool isEmpty = s.Substring(start, end - start).Trim(' ', '\t') == "";