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#
risposta
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.
È possibile ottenere ciò disegnando il proprio controllo. Ecco un esempio di come disegnare te stesso link
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();
}
}
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.
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
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();
}
Partenza questo progetto su Codice progetto - http://www.codeproject.com/KB/edit/numberedtextbox.aspx –
Forse si dovrebbe prendere lo stesso controllo come Notepad ++. Questo è Scintilla.Net: http://scintillanet.codeplex.com/ – Oliver