2010-04-02 4 views
8

Ich mache einen einfachen Text- und Skript-Editor mit Code-Hervorhebung. Dafür benutze ich eine RichTextBox. Aber ich weiß nicht, wie man die Zeilennummern auf der linken Seite wie in VS oder Notepad ++ zeigt. Gibt es eine Lösung?So zeigen Sie die Nummer einer Zeile in einer RichTextBox an C#

+1

Schauen Sie sich dieses Projekt auf Code Project - http://www.codeproject.com/KB/edit/numberedtextbox.aspx –

+0

Vielleicht sollten Sie die gleiche Kontrolle übernehmen als Notepad ++. Dies ist Scintilla.Net: http://scintillanet.codeplex.com/ – Oliver

Antwort

16

Ich versuchte Wiederverwendung des Codes aus dem Codeproject Artikel an anderer Stelle verwiesen wird, aber jede Option, die ich betrachten, schien ein bisschen zu kludgy.

Also baute ich eine andere RichTextBoxEx, die Zeilennummern anzeigt.

Die Zeilennummerierung kann ein- oder ausgeschaltet werden. Es ist schnell. Es scrollt sauber. Sie können die Farbe der Zahlen, die Hintergrundfarben für einen Farbverlauf, die Randstärke, die Schriftart und die Verwendung führender Nullen auswählen. Sie können Linien wie angezeigt oder nach den harten Zeilenumbrüchen in der RTB nummerieren.

Beispiele:

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

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

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

Es Einschränkungen: es zeigt nur Zahlen auf der linken Seite. Sie könnten das ohne viel Aufwand ändern, wenn Sie interessiert wären.

Der Code ist als C# -Projekt konzipiert. Obwohl es Teil einer größeren "Lösung" ist (ein XPath-Visualisierungstool), ist die benutzerdefinierte RichTextBox als separierbare Assembly gepackt und kann in Ihren neuen Projekten verwendet werden. Fügen Sie in Visual Studio lediglich einen Verweis auf die DLL hinzu, und ziehen Sie sie per Drag & Drop auf Ihre Designoberfläche. Sie können einfach den anderen Code aus der größeren Lösung verwerfen.

See the code

-1

Sie können das erreichen, indem Sie Ihre eigene Kontrolle zeichnen. Hier ist ein Beispiel, wie man sich zeichnet link

0

Ich würde jede Zeile in einer Klasse speichern, die Methoden zur Veröffentlichung in der Richtextbox hat. In dieser Methode können Sie die Zeilennummer basierend auf ihrer Position in der Klasse voranstellen.

Zum Beispiel (sehr grob):

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/ könnte die praktikabelste Lösung für Ihre Bedürfnisse. Aber für mein Projekt habe ich eine Lösung von Cheeso (RichTextBoxEx von XPath Visualizer) vorgeschlagen. Es ist einfach und schnell genug für nicht sehr große Dokumente. Alle anderen .net-Komponenten aus dem Internet waren unglaublich langsam.

-1

Der einfache Weg:

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