ایجاد شماره خطوط برای RichTextBox در سی شارپ

RichTextBox

در این مقاله با هم به سراغ ایجاد شماره خطوط برای 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();    
        }    
    
    }    
}   

موفق باشید !

  • پسورد: www.mspsoft.com
داریوش فرخی

داریوش فرخی هستم از سال 92 شروع به یادگیری برنامه نویسی و از سال 93 در بخش برنامه نویسی و تولید محتوای سایت mspsoft.com مشغول هستم. فعالیتم نیز بیشتر در زمینه های برنامه نویسی با سی شارپ و asp.net بوده است. اوقات فراغتم را هم غالبا با تماشای فیلم یا بازی های کامپیوتری پر میکنم .

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

    ssc پاسخ

    ممنون از این آموزش.
    واقعا عالی بود.
    با یه محیط گرم و جذاب و شیوه ی آموزشی قدم به قدم و پروژه محور، واقعا به دل می شینه و به یادگیری خیلی کمک می کنه.

      مسعود شریفی پاسخ

      خواهش میکنم موفق باشید.