代码之家  ›  专栏  ›  技术社区  ›  Zach Johnson

从字符索引中确定逻辑行(WinForms文本框)

  •  6
  • Zach Johnson  · 技术社区  · 16 年前

    如果我打电话 textBox.GetLineFromCharIndex(int) 在一个 TextBox 具有 WordWrap = true ,它返回用户看到的行索引(换行计数为多行),而不是根据换行符返回的行。

    Line one extends to       // <- word wrapped
    here.                     // <- logical line 1, GetLineFromCharIndex returns line 2
    This is line two.         // <- logical line 2, GetLineFromCharIndex returns line 3

    有人知道从字符索引而不是显示行中找到逻辑行的解决方案吗?

    4 回复  |  直到 10 年前
        1
  •  2
  •   mindless.panda    16 年前

    查找在整个文本中直到字符索引的新行出现次数。

    也许首先将文本框文本的子字符串带到您的char索引。在换行符上使用split,并计算结果。

    或者,循环解决方案将使用索引函数并计算在char索引之前找到的新行数。

        2
  •  1
  •   t0mm13b    10 年前

    我倾向于认为这种解决方案比到处寻找新行更快。你需要' SendMessage '到带有' EM_LINEFROMCHAR 信息

    [DllImport("User32.DLL")]
    public static extern int SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);
    
    public const int EM_LINEFROMCHAR = 0xC9;
    
    int noLines = SendMessage(TextBox.Handle, EM_LINEFROMCHAR, TextBox.TextLength, 0);
    

    这样,您就可以根据字符串的长度找出最后一行……这将告诉您使用的逻辑行的数量……

    希望能帮上忙,

        3
  •  0
  •   Vincent Lidou    13 年前

    以下对我有效-没有明显的性能影响

    this.WordWrap = false;
    int lineIndex = this.GetLineFromCharIndex(this.SelectionStart);
    string lineText = this.Lines[lineIndex];
    this.WordWrap = true;
    
        4
  •  0
  •   Nikhil Freddroid    13 年前

    如果您不想编写循环,也可以使用带有func、lambda表达式的字符串扩展方法。-

    long lineNumber = textBox.Text.Substring(0, textBox.SelectionStart).LongCount(chr => chr == '\r');
    

    这将返回基于0的行号。

    推荐文章