2009-03-18 6 views
11

Possiedo un controllo RichTextbox multilinea in cui voglio integrare la funzionalità di aggiunta di un numero di riga. Ho preso in considerazione molti approccivisualizzazione del numero di riga nella casella di testo RT C#

  1. Aggiungere un'etichetta e l'aggiornamento dei numeri di riga, come il numero di linea cambia
  2. Aggiungi un picturebox insieme per disegnare stringa su di esso.
  3. Aggiungi un'altra casella di testo e mostra i numeri di riga
  4. Aggiungi la casella di riepilogo e visualizza i numeri di riga.

Ho due dubbi.

  1. Il richtextbox che sto usando è un controllo personalizzato e si allontana dalla classe RichTextBox. Come posso aggiungere più controlli ad esso.
  2. Qual è l'approccio migliore per mostrare i numeri di riga per il testo multilinea in C#
+0

Si potrebbe dare un'occhiata a questi articoli per vedere come hanno implementato esso: [LINENUMBERS per il RichTextBox] (http://www.codeproject.com/KB/cpp/linenumbers_for_rtb.aspx) [ Numerazione delle righe di RichTextBox in .NET 2.0] (http://www.codeproject.com/KB/edit/numberedtextbox.aspx) – Stormenet

+0

Ecco il blog per creare numeri di riga per RichTextBox utilizzando C# - [Creazione di numeri di riga per RichTextBox in C#] (http://www.c-sharpcorner.com/blogs/creating-line-numbers-for-richtextbox-in-c-sharp) –

risposta

3

il mio esempio. Tutto è bene, ma ritorno a capo automatico deve essere disattivata :(

int maxLC = 1; //maxLineCount - should be public 
    private void rTB_KeyUp(object sender, KeyEventArgs e) 
    { 
     int linecount = rTB.GetLineFromCharIndex(rTB.TextLength) + 1; 
     if (linecount != maxLC) 
     { 
      tB_line.Clear(); 
      for (int i = 1; i < linecount+1; i++) 
      { 
       tB_line.AppendText(Convert.ToString(i) + "\n"); 
      } 
      maxLC = linecount; 
     } 
    } 

dove RTB è la mia RichTextBox e la TBC è textBox accanto al RTB

JT jr

2

questo codice mi ha aiutato grazie, necessario per convertire visual basic ma potrebbe:

Private Sub TextBox1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp 
    Dim maxlc As Integer = 1 
    Dim linecount As Integer = TextBox1.GetLineFromCharIndex(TextBox1.Height) + 1 

    If linecount <> maxlc Then 
     TextBox2.Clear() 
     For i = 0 To linecount - 1 Step 1 
      TextBox2.AppendText(Convert.ToString(i) + vbNewLine) 
     Next i 
     maxlc = linecount 
    End If 
End Sub 
1

funziona al 100% !!! ma è necessario aggiungere RichTextBox2 per numeri di riga, se si vuole cambiare per altri forma come elencoB Bue, comunque mi è servito bene.

private void richTextBox1_keyDown(object sender, KeyEventArgs e) 
    { 

     for (int i = 0; i <= richTextBox1.Lines.Count(); i++) 
     { 
      if (!(e.KeyCode == Keys.Back)) 
      { 
       if (!richTextBox2.Text.Contains(i.ToString())) 
       { 
        richTextBox2.Text += i.ToString() + "\n"; 
       } 
      } 
      else 
      { 
       richTextBox2.Clear(); 
      } 
     }  
    } 
1
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