2010-04-02 37 views
8

Sto creando un semplice editor di testo e script con l'evidenziazione del codice. Per questo io uso un RichTextBox. Ma non so come farlo mostrare i numeri delle linee sul lato sinistro, come in VS o Notepad ++. C'è qualche soluzione?Come mostrare il numero di una riga in un RichTextBox C#

+1

Partenza questo progetto su Codice progetto - http://www.codeproject.com/KB/edit/numberedtextbox.aspx –

+0

Forse si dovrebbe prendere lo stesso controllo come Notepad ++. Questo è Scintilla.Net: http://scintillanet.codeplex.com/ – Oliver

risposta

16

Ho provato a ri-utilizzando il codice dagli articoli CodeProject riferimento altrove, ma ogni opzione ho guardato, sembrava un po 'troppo kludgy.

Quindi ho creato un altro RichTextBoxEx che visualizza i numeri di riga.

La numerazione delle righe può essere attivata o disattivata. È veloce. Scorre perfettamente. È possibile selezionare il colore dei numeri, i colori di sfondo per una sfumatura, lo spessore del bordo, il carattere, se utilizzare gli zeri iniziali. È possibile scegliere di numerare le righe "come visualizzate" o in base alle nuove righe nella RTB.

Esempi:

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

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

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

presenta delle limitazioni: visualizza solo numeri sulla sinistra. Potresti cambiarlo senza troppi sforzi se ti interessi.

Il codice è progettato come progetto C#. Sebbene faccia parte di una "soluzione" più ampia (uno strumento di visualizzazione XPath), il RichTextBox personalizzato è confezionato come un assembly separabile ed è pronto per l'uso nei nuovi progetti. In Visual Studio, è sufficiente aggiungere un riferimento alla DLL e trascinarlo sulla superficie del progetto. Puoi semplicemente scartare l'altro codice dalla soluzione più grande.

See the code

-1

È possibile ottenere ciò disegnando il proprio controllo. Ecco un esempio di come disegnare te stesso link

0

Vorrei memorizzare ogni riga in una classe che ha metodi per pubblicare in richtextbox. In tale metodo, è possibile anteporre il numero di riga in base alla sua posizione nella classe.

Per esempio (molto approssimativamente):

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/ potrebbe essere la soluzione più fattibile per le vostre esigenze. Ma per il mio progetto ho usato una soluzione suggerita da Cheeso (RichTextBoxEx da XPath visualizer). È semplice e abbastanza veloce per documenti non molto grandi. Tutti gli altri componenti .net da Internet erano incredibilmente lenti.

-1

Il modo più semplice:

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(); 
    } 
Problemi correlati