2010-04-02 14 views
8

Tôi đang tạo một trình soạn thảo văn bản và tập lệnh đơn giản với làm nổi bật mã. Cho rằng tôi sử dụng một RichTextBox. Nhưng tôi không biết làm thế nào để làm cho nó hiển thị các dòng chữ số ở phía bên trái, giống như trong VS hoặc Notepad ++. Có giải pháp nào không?Cách hiển thị số của một dòng trong RichTextBox C#

+1

Kiểm tra dự án này vào dự án luật - http://www.codeproject.com/KB/edit/numberedtextbox.aspx –

+0

Có lẽ bạn nên đi kiểm soát tương tự như Notepad ++. Đây là Scintilla.Net: http://scintillanet.codeplex.com/ – Oliver

Trả lời

16

tôi đã cố gắng tái sử dụng mã từ các bài viết CodeProject tham chiếu ở nơi khác, nhưng mỗi tùy chọn Tôi nhìn, có vẻ hơi quá kludgy.

Vì vậy, tôi đã tạo một RichTextBoxEx khác để hiển thị số dòng.

Tính năng đánh số dòng có thể được bật hoặc tắt. Nhanh quá. Nó cuộn sạch. Bạn có thể chọn màu của các số, màu nền cho độ dốc, độ dày đường viền, phông chữ, cho dù sử dụng số không đứng đầu. Bạn có thể chọn để số dòng "như được hiển thị" hoặc theo dòng mới cứng trong RTB.

Ví dụ:

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

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

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

Nó có những hạn chế: nó sẽ hiển thị số chỉ ở bên trái. Bạn có thể thay đổi điều đó mà không cần nỗ lực quá nhiều nếu bạn quan tâm.

Mã được thiết kế dưới dạng dự án C#. Mặc dù nó là một phần của một "giải pháp" lớn hơn (một công cụ Visualization XPath), RichTextBox tùy chỉnh được đóng gói như một hội đồng phân tách, và sẵn sàng để sử dụng trong các dự án mới của bạn. Trong Visual Studio, chỉ cần thêm một tham chiếu đến DLL, và bạn có thể kéo và thả nó vào bề mặt thiết kế của bạn. Bạn chỉ có thể loại bỏ mã khác khỏi giải pháp lớn hơn.

See the code

-1

Bạn có thể đạt được điều đó bằng cách vẽ điều khiển của riêng bạn. Dưới đây là ví dụ về cách vẽ chính mình link

0

Tôi sẽ lưu trữ mỗi dòng trong một lớp có phương thức xuất bản lên richtextbox. Trong phương thức đó, bạn có thể thêm trước số dòng dựa trên vị trí của nó trong lớp.

Ví dụ (rất gần):

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/ có thể là giải pháp khả thi nhất cho nhu cầu của bạn. Nhưng đối với dự án của tôi, tôi đã sử dụng giải pháp được đề xuất bởi Cheeso (RichTextBoxEx từ trình hiển thị XPath). Nó đơn giản và đủ nhanh cho các tài liệu không phải là rất lớn. Tất cả các thành phần .net khác từ internet cực kỳ chậm.

-1

Cách đơn giản:

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