در این مقاله با هم به سراغ ایجاد شماره خطوط برای RichTextBox مانند هر editor موجود ، خواهیم رفت. این عملیات را میتوانید به صورت مرحله به مرحله همراه با تمامی کد ها و رویداد های موردنیاز در ادامه ی مطلب مطالعه کنید. با من همراه باشید …
برسی RichTextBox
من از تابع AddLineNumbers() برای فراخوانی در هر جای برنامه استفاده میکنم.
همچنین از تابع getWidth() که مقدار مشخص عرض را با توجه تعداد خط ها برای سایزبندی اتوماتیک عرض تعداد خطوط برمیگرداند ، استفاده میکنیم.
قطعه کد مربوط به تابع AddLineNumbers() :
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"; } }
قدم اول : ویژوال استودیو را اجرا کنید و یک پروژه ی ویندوز جدید در سی شارپ ایجاد کنید.
قدم دوم : یک عدد RichTextBox را درون فرم بیاندازید و خصوصیات آن را مانند زیر تنطیم کنید:
Name | LineNumberTextBox |
BackColor | White |
BorderStyle | None |
Cursor | PanNE |
Dock | Left |
ForeColor | Black |
ReadOnly | true |
ScrollBars | None |
میتوانید BackColor و ForeColor در LineNumberTextBox به سلیقه خودتان انتخاب کنید.
[divider style=”normal” top=”20″ bottom=”20″]پیشنهاد میکنم :کار با کلاس Abstract در سی شارپ
[divider style=”normal” top=”20″ bottom=”20″]
برای ForeColor و BackColor آنها را همانند خصوصیات بالا به LineNumberTextBox تنطیم کرده ایم.
قدم سوم : یک RichTextBox را داخل فرم بکشید و خاصیت Dock آن را برابر با Fill قرار دهید. اسم پیش فرض آن میتواند richTextBox1 باشید.
قدم چهارم : تابع AddLineNumbers() را به کد این فرم اضافه کنید.
قدم پنجم : رویداد هاو کد های زیر را به فرم اضافه کنید :
Load
private void Form1_Load(object sender, EventArgs e) { LineNumberTextBox.Font = richTextBox1.Font; richTextBox1.Select(); AddLineNumbers(); }
Resize
private void Form1_Resize(object sender, EventArgs e) { AddLineNumbers(); }
قدم ششم : رویداد ها و کد های زیر را richTextBox1 اضافه کنید :
SelectionChanged
private void richTextBox1_SelectionChanged(object sender, EventArgs e) { Point pt = richTextBox1.GetPositionFromCharIndex(richTextBox1.SelectionStart); if (pt.X == 1) { AddLineNumbers(); } }
VScroll
private void richTextBox1_VScroll(object sender, EventArgs e) { LineNumberTextBox.Text = ""; AddLineNumbers(); LineNumberTextBox.Invalidate(); }
TextChanged
private void richTextBox1_TextChanged(object sender, EventArgs e) { if (richTextBox1.Text == "") { AddLineNumbers(); } }
FontChanged
private void richTextBox1_FontChanged(object sender, EventArgs e) { LineNumberTextBox.Font = richTextBox1.Font; richTextBox1.Select(); AddLineNumbers(); }
قدم هفتم : رویداد ها و کدهای زیر را برای LineNumberTextBox اضافه کنید :
MouseDown
private void LineNumberTextBox_MouseDown(object sender, MouseEventArgs e) { richTextBox1.Select(); LineNumberTextBox.DeselectAll(); }
قدم هشتم : فرم را debug کنید و آن را چک کنید :
using System; using System.Drawing; using System.Windows.Forms; namespace LineNumbers_CSharp { public partial class Form1 : Form { public Form1() { InitializeComponent(); } 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(); } } }
موفق باشید !
ممنون از این آموزش.
واقعا عالی بود.
با یه محیط گرم و جذاب و شیوه ی آموزشی قدم به قدم و پروژه محور، واقعا به دل می شینه و به یادگیری خیلی کمک می کنه.
۴
خواهش میکنم موفق باشید.
۴
سلام خیلی خیلی ممنون به خاطر این آموزش.
۵