【问题标题】:Determine Logical Line From Char Index (Winforms TextBox)从字符索引确定逻辑行(Winforms TextBox)
【发布时间】:2010-03-03 23:15:37
【问题描述】:

如果我用WordWrap = trueTextBox 中调用textBox.GetLineFromCharIndex(int),它会返回用户看到的行索引(换行算作多行),而不是根据换行符返回的行。

第一行延伸到 // 

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

【问题讨论】:

    标签: c# .net winforms textbox


    【解决方案1】:

    查找整个文本中换行符出现的次数,直到您的 char 索引。

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

    或者,循环解决方案将使用索引函数并计算找到多少换行符直到您的 char 索引。

    【讨论】:

    • 我最终选择了循环解决方案。谢谢!
    【解决方案2】:

    我倾向于认为这种解决方案比循环寻找换行符更快。您需要在带有“EM_LINEFROMCHAR”消息的文本框中输入“SendMessage

    [DllImport("User32.DLL")] 公共静态外部 int SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam); 公共常量 int EM_LINEFROMCHAR = 0xC9; int noLines = SendMessage(TextBox.Handle, EM_LINEFROMCHAR, TextBox.TextLength, 0);

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

    希望这会有所帮助,

    【讨论】:

    • @Zach: 哦....我没有意识到...tbqh...这种方法在工作时很少使用....很好的捕获....
    【解决方案3】:

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

    this.WordWrap = false;
    int lineIndex = this.GetLineFromCharIndex(this.SelectionStart);
    string lineText = this.Lines[lineIndex];
    this.WordWrap = true;
    

    【讨论】:

    • 对我来说可悲的是,有 5000 行文字,它“闪烁”/重绘大约一秒钟......
    【解决方案4】:

    如果您不想编写循环,也可以使用字符串扩展方法,例如 Func、lambda 表达式或其他任何东西-

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

    这将返回基于 0 的行号。

    【讨论】:

      【解决方案5】:

      当我点击 RichTextBox 时,我使用此代码查找行索引:

      string sub = richtextbox1.Text.Substring(0, richtextbox1.SelectionStart);
      int index = sub.Count(f => f == '\n');
      

      【讨论】:

        猜你喜欢
        • 2021-06-30
        • 2016-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-29
        相关资源
        最近更新 更多