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#
Antwort
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.
Sie können das erreichen, indem Sie Ihre eigene Kontrolle zeichnen. Hier ist ein Beispiel, wie man sich zeichnet link
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();
}
}
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.
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
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();
}
Schauen Sie sich dieses Projekt auf Code Project - http://www.codeproject.com/KB/edit/numberedtextbox.aspx –
Vielleicht sollten Sie die gleiche Kontrolle übernehmen als Notepad ++. Dies ist Scintilla.Net: http://scintillanet.codeplex.com/ – Oliver