【问题标题】:Numbered list on RichtextboxRichtextbox 上的编号列表
【发布时间】:2013-09-05 03:27:00
【问题描述】:

我正在尝试将编号列表功能添加到文本编辑器。 RichTextbox 已经提供了SelectionBullet 属性来将选择更改为项目符号列表。但我找不到类似的属性来生成编号列表。是否有任何 标准方法 在 Richtextbox 上创建编号列表。 如果没有,我将不得不自己实现它,所以可以帮助我的代码片段会有所帮助,谢谢。

【问题讨论】:

    标签: c# winforms richtextbox


    【解决方案1】:

    我知道一个链接通常不被接受为一个好的答案,但是 CodeProject 上的文章 RichTextBox with Search Line Numbering, Bulleting, Printing, Searching Support 可能会帮助你找到你正在寻找的东西。

    在本文中,作者将 RichTextBox 控件扩展为可以执行您所要求的操作(以及更多)的功能,并将代码发布在那里供所有人查看。

    【讨论】:

    • @Yohannes 耶,接受吗?我不会在这里转发别人的代码并声称它是我的,这就是我只提供链接的原因。
    【解决方案2】:

    嗯,我实现它如下。

      private void btnNumbers_Click(object sender, EventArgs e)
            {
                string temptext = rtbMain.SelectedText;
    
                int SelectionStart = rtbMain.SelectionStart;
                int SelectionLength = rtbMain.SelectionLength;
    
                rtbMain.SelectionStart = rtbMain.GetFirstCharIndexOfCurrentLine();
                rtbMain.SelectionLength = 0;
                rtbMain.SelectedText = "1. ";
    
                int j = 2;
                for( int i = SelectionStart; i < SelectionStart + SelectionLength; i++)
                    if (rtbMain.Text[i] == '\n')
                    {
                        rtbMain.SelectionStart = i + 1;
                        rtbMain.SelectionLength = 0;
                        rtbMain.SelectedText = j.ToString() + ". ";
                        j++;
                        SelectionLength += 3;
                    }
    
            }
    
            private void rtbMain_KeyDown(object sender, KeyEventArgs e)
            {//this piece of code automatically increments the bulleted list when user //presses Enter key
                int tempNum;
                if (e.KeyCode == Keys.Enter)
                    try
                        {
                            if (char.IsDigit(rtbMain.Text[rtbMain.GetFirstCharIndexOfCurrentLine()]))
                            {
                                if (char.IsDigit(rtbMain.Text[rtbMain.GetFirstCharIndexOfCurrentLine() + 1]) && rtbMain.Text[rtbMain.GetFirstCharIndexOfCurrentLine() + 2] == '.')
                                    tempNum = int.Parse(rtbMain.Text.Substring(rtbMain.GetFirstCharIndexOfCurrentLine(),2));
                                else tempNum = int.Parse(rtbMain.Text[rtbMain.GetFirstCharIndexOfCurrentLine()].ToString());
    
                                if (rtbMain.Text[rtbMain.GetFirstCharIndexOfCurrentLine() + 1] == '.' || (char.IsDigit(rtbMain.Text[rtbMain.GetFirstCharIndexOfCurrentLine() + 1]) && rtbMain.Text[rtbMain.GetFirstCharIndexOfCurrentLine() + 2] == '.'))
                                {
                                    tempNum++;
                                        rtbMain.SelectedText = "\r\n" + tempNum.ToString() + ". ";
                                    e.SuppressKeyPress = true;
                                }
                            }  
                        }
                     catch{}
            }
    

    【讨论】:

      【解决方案3】:

      这是我的答案...易于阅读和改进。我采用了一种截然不同的方法,但添加了删除选择中的编号列表(如果它已经存在)的功能。请注意,到目前为止,我只对它进行了轻微的测试,它似乎运行良好......但它可能需要进一步完善。

          private void btnOrdered_Click(object sender, EventArgs e)
          {
              string[] splitSelection = null;
              // If selection split selection else split everything
              if (this.txtCaptionEditor.SelectionLength > 0)
              {
                  splitSelection = this.txtCaptionEditor.SelectedText.Replace("\r\n", "\n").Split("\n".ToCharArray());
              }
              else
              {
                  splitSelection = this.txtCaptionEditor.Text.Replace("\r\n", "\n").Split("\n".ToCharArray());
              }
              bool Exists = false;
              for (int i = 0; i < splitSelection.GetLength(0); i++)
              {
                  // If Ordered List Allready exists in selection then remove else add
                  if (!string.IsNullOrEmpty(splitSelection[i]))
                  {
                      if (splitSelection[i].Substring(0, 2) == "1.") { Exists = true; }
                  }
              }
      
              for (int i = 0; i < splitSelection.GetLength(0); i++)
              {
                  int lineCount = (i + 1);
                  if (Exists)
                  {
                      this.txtCaptionEditor.Text = this.txtCaptionEditor.Text.Replace(Convert.ToString(lineCount) + ".  ", "");
                  }
                  else
                  {
                      if(!string.IsNullOrEmpty(splitSelection[i]))
                      {
                          this.txtCaptionEditor.Text = this.txtCaptionEditor.Text.Replace(splitSelection[i], Convert.ToString(lineCount) + ".  " + splitSelection[i]);
                      }
      
                  }
              }
          }
      
          private void txtCaptionEditor_KeyDown(object sender, KeyEventArgs e)
          {
              string[] splitSelection = this.txtCaptionEditor.Text.Replace("\r\n", "\n").Split("\n".ToCharArray());
              if (e.KeyCode == Keys.Enter)
              {
                  // Get Current Line Position
                  int currentLine = this.txtCaptionEditor.GetLineFromCharIndex(this.txtCaptionEditor.SelectionStart);
                  // Only Run if the previous line is greater than zero
                  if ((currentLine) >= 0)
                  {
                      // Loop through 100 possible numbers for match you can go higher 
                      // If you think your numbered list could go above 100
                      for (int i = 0; i < 100; i++)
                      {
                          if (splitSelection[(currentLine)].Substring(0, 2) == Convert.ToString((i + 1)) + ".")
                          {
                              // If the substring of the current line equals a numbered list                value.. enumerate next line
                              this.txtCaptionEditor.SelectedText = "\n" + (i + 2) + ".  ";
                              e.SuppressKeyPress = true;
                          }
                      }
                  }
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-02
        • 1970-01-01
        • 2019-04-18
        • 2010-10-19
        • 2018-10-11
        • 2016-07-05
        • 2011-12-02
        • 2016-09-17
        相关资源
        最近更新 更多