2010-04-02 120 views
8

Estoy creando un editor de texto y script simple con código resaltado. Para eso uso un RichTextBox. Pero no sé cómo hacer que muestre los números de las líneas en el lado izquierdo, como en VS o Notepad ++. ¿Hay alguna solución?Cómo mostrar el número de una línea en un RichTextBox C#

+1

Comprobar a cabo este proyecto en el Proyecto de Código - http://www.codeproject.com/KB/edit/numberedtextbox.aspx –

+0

tal vez debería tener el mismo control como Notepad ++. Esto es Scintilla.Net: http://scintillanet.codeplex.com/ – Oliver

Respuesta

16

Intenté volver a utilizar el código de los artículos CodeProject referenciados en cualquier lugar, pero todas las opciones miraba, parecía un poco demasiado kludgy.

Así que construí otro RichTextBoxEx que muestra los números de línea.

La numeración de línea se puede activar o desactivar. Es rápido. Se desplaza limpiamente. Puede seleccionar el color de los números, los colores de fondo de un degradado, el grosor del borde, la fuente, si usar ceros a la izquierda. Puede elegir numerar las líneas "tal como se muestran" o según las líneas rectas nuevas en el RTB.

Ejemplos:

alt text http://i39.tinypic.com/13zcoz6.jpg

alt text http://i43.tinypic.com/wml2z9.jpg

alt text http://i39.tinypic.com/25i4x3o.jpg

tiene limitaciones: muestra sólo números a la izquierda. Podrías cambiar eso sin demasiado esfuerzo si te importa.

El código está diseñado como proyecto de C#. Aunque es parte de una "solución" más grande (una herramienta de visualización XPath), el RichTextBox personalizado se empaqueta como un ensamblaje separable y está listo para usar en sus nuevos proyectos. En Visual Studio, simplemente agregue una referencia a la DLL, y puede arrastrar y soltar en su superficie de diseño. Puedes descartar el otro código de la solución más grande.

See the code

-1

Puede lograrlo dibujando su propio control. Aquí hay un ejemplo de cómo dibujar usted mismo link

0

Me gustaría almacenar cada línea en una clase que tiene métodos para publicar en richtextbox. En ese método, puede anteponer el número de línea en función de su posición en la clase.

Por ejemplo (muy aproximadamente):

class myText 
{ 
    public List<string> Lines; 

    public string GetList() 
    { 
     StringBuilder sb = new StringBuilder(); 
     int i = 0; 
     foreach (string s in Lines) 
     { 
      sb.AppendFormat("{0}: {1}", i, s).AppendLine(); 
      i++; 
     } 
     return sb.ToString(); 
    } 
} 
0

Scintilla.Net http://scintillanet.codeplex.com/ podría ser la solución más viable para sus necesidades. Pero para mi proyecto usé la solución sugerida por Cheeso (RichTextBoxEx del visualizador XPath). Es lo suficientemente simple y rápido para documentos no muy grandes. Todos los demás componentes .net de Internet fueron increíblemente lentos.

-1

La forma más sencilla:

Dim myArray = RichTextBox1.Text.Split() 

Dim cnt As Integer = 0 
RichTextBox1.Clear() 

Do While cnt < myArray.Count 
    RichTextBox1.AppendText(cnt & ":" & myArray(cnt) & vbNewLine) 
    cnt = cnt + 1 
Loop 
0
public int getWidth() 
    { 
     int w = 25; 
     // get total lines of richTextBox1 
     int line = richTextBox1.Lines.Length; 

     if (line <= 99) 
     { 
      w = 20 + (int)richTextBox1.Font.Size; 
     } 
     else if (line <= 999) 
     { 
      w = 30 + (int)richTextBox1.Font.Size; 
     } 
     else 
     { 
      w = 50 + (int)richTextBox1.Font.Size; 
     } 

     return w; 
    } 

    public void AddLineNumbers() 
    { 
     // create & set Point pt to (0,0) 
     Point pt = new Point(0, 0); 
     // get First Index & First Line from richTextBox1 
     int First_Index = richTextBox1.GetCharIndexFromPosition(pt); 
     int First_Line = richTextBox1.GetLineFromCharIndex(First_Index); 
     // set X & Y coordinates of Point pt to ClientRectangle Width & Height respectively 
     pt.X = ClientRectangle.Width; 
     pt.Y = ClientRectangle.Height; 
     // get Last Index & Last Line from richTextBox1 
     int Last_Index = richTextBox1.GetCharIndexFromPosition(pt); 
     int Last_Line = richTextBox1.GetLineFromCharIndex(Last_Index); 
     // set Center alignment to LineNumberTextBox 
     LineNumberTextBox.SelectionAlignment = HorizontalAlignment.Center; 
     // set LineNumberTextBox text to null & width to getWidth() function value 
     LineNumberTextBox.Text = ""; 
     LineNumberTextBox.Width = getWidth(); 
     // now add each line number to LineNumberTextBox upto last line 
     for (int i = First_Line; i <= Last_Line + 2; i++) 
     { 
      LineNumberTextBox.Text += i + 1 + "\n"; 
     } 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     LineNumberTextBox.Font = richTextBox1.Font; 
     richTextBox1.Select(); 
     AddLineNumbers(); 
    } 

    private void richTextBox1_SelectionChanged(object sender, EventArgs e) 
    { 
     Point pt = richTextBox1.GetPositionFromCharIndex(richTextBox1.SelectionStart); 
     if (pt.X == 1) 
     { 
      AddLineNumbers(); 
     } 
    } 

    private void richTextBox1_VScroll(object sender, EventArgs e) 
    { 
     LineNumberTextBox.Text = ""; 
     AddLineNumbers(); 
     LineNumberTextBox.Invalidate(); 
    } 

    private void richTextBox1_TextChanged(object sender, EventArgs e) 
    { 
     if (richTextBox1.Text == "") 
     { 
      AddLineNumbers(); 
     } 
    } 

    private void richTextBox1_FontChanged(object sender, EventArgs e) 
    { 
     LineNumberTextBox.Font = richTextBox1.Font; 
     richTextBox1.Select(); 
     AddLineNumbers(); 
    } 

    private void LineNumberTextBox_MouseDown(object sender, MouseEventArgs e) 
    { 
     richTextBox1.Select(); 
     LineNumberTextBox.DeselectAll(); 
    } 

    private void Form1_Resize(object sender, EventArgs e) 
    { 
     AddLineNumbers(); 
    } 
Cuestiones relacionadas