Richtextbox Numbered List

I am trying to add number list functionality to a text editor. RichTextbox already provides a SelectionBullet property to change the selection to a bulleted list. But I could not find a similar property to create a numbered list. Is there a standard way to create a numbered list in Richtextbox. If not , I would have to implement it myself, so a code that can help me will help, thanks.

+4
source share
3 answers

I know that the link is not perceived gernerally as a good answer, however, a RichTextBox article with numbering of search strings, Bulletting, Printing, Search Support on CodeProject, may help you to know a little what you are looking for.

In this article, the author extends the RichTextBox control into something that can do what you ask (and much more), plus the code is placed there so that everyone can see.

+2
source

Well, I implemented it as follows.

  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{} } 
+1
source

Here is my answer ... which is easy to read and modify. I took a completely different approach, but added the ability to remove a numbered list within the selection, if it already exists. Please note that so far I have only tested it a little and it seems to have worked well ... but it may need further refinement.

  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; } } } } } 
0
source

Source: https://habr.com/ru/post/1443683/


All Articles