如何检查光标是否在文本框中的空白行?

时间:2014-10-31 16:25:08

标签: c# winforms textbox

我尝试使用以下代码在文本框中查找空(或空白)行,但我不知道如何在插入符号位置之前找到第一个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() == "";

6 个答案:

答案 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') == "";