【问题标题】:How to get the current line in a RichTextBox control?如何获取 RichTextBox 控件中的当前行?
【发布时间】:2010-04-22 19:53:48
【问题描述】:

假设我单击了 RichTextBox 控件内的某个位置。如何获取插入符号当前所在的当前行?

顺便说一句,这是检索该行的整个文本字符串。

【问题讨论】:

    标签: c# .net winforms richtextbox


    【解决方案1】:

    这对我有用:

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

    【讨论】:

      【解决方案2】:

      RichTextBox.GetLineFromCharIndex() 就是这样做的。传递 SelectionStart 属性值。

      【讨论】:

        【解决方案3】:

        一种方法是发送EM_LINEFROMCHAR Message。我敢肯定还有其他方法。

        【讨论】:

          【解决方案4】:

          我的答案比文森特的更棒,因为在得到正确的行号后,我注意到它在闪烁,非常可怕。所以我添加了一个内存富文本框来做那里的工作。

          private int GetCharacterIndexOfSelection()
          {
              var wordWrappedIndex = this.SelectionStart;
          
              RichTextBox scratch = new RichTextBox();
              scratch.Lines = this.Lines;
              scratch.SelectionStart = wordWrappedIndex;
              scratch.SelectionLength = 1;
              scratch.WordWrap = false;
              return scratch.SelectionStart;
          }
          
          private int GetLineNumberOfSelection()
          {
              var selectionStartIndex = GetCharacterIndexOfSelection();
          
              RichTextBox scratch = new RichTextBox();
              scratch.Lines = this.Lines;
              scratch.SelectionStart = selectionStartIndex;
              scratch.SelectionLength = 1;
              scratch.WordWrap = false;
              return scratch.GetLineFromCharIndex(selectionStartIndex);
          }
          

          【讨论】:

            【解决方案5】:

            这通过从文档的开头开始计数来工作。

                            var startlinenumber = FindLineNumber(RichText, RichText.Selection.Start);
                            var endlinenumber = FindLineNumber(RichText, RichText.Selection.End);
            

            这是实际的功能。

            int FindLineNumber(RichTextBox rtb, TextPointer p)
            {
                var findStart = p?.GetLineStartPosition(0);
                if (findStart == null) return 0;
                var startLinePosition = rtb.Document.ContentStart.GetLineStartPosition(0);
                if (startLinePosition == null) return 0;
            
                var foundLineNumber = 0;
                while (true)
                {
                    if (startLinePosition.CompareTo(findStart) >= 0)
                    {
                        break;
                    }
            
                    startLinePosition = startLinePosition.GetLineStartPosition(1, out var result);
                    if (result == 0)
                    {
                        break;
                    }
            
                    foundLineNumber++;
                }
            
                return foundLineNumber;
            }
            

            【讨论】:

              【解决方案6】:

              如果您想从您现在正在调试的编辑器控件中获取当前行号,那么

              int lineNumber = (new StackTrace()).GetFrame(1).GetFileLineNumber();
              

              我认为它对您的问题有帮助。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-07-02
                • 2010-12-31
                • 1970-01-01
                • 2019-03-16
                相关资源
                最近更新 更多