امروز موقع کار نیاز به یک TextBox داشتم که قابلیت Digit Grouping یا جداسازی اعداد رو پشتیبانی کنه، یعنی اعداد به صورت یکان، دهگان و ... جدا بشن. با جستجو چیزی که به کارم بیاد پیدا نکردم و خودم دست به کار شدم.

برای یادگیری و آموزش سی شارپ ( آموزش زبان برنامه نویسی سی شارپ ) رایگان به این لینک بروید

با فرض اینکه یک TextBox با نام TextBox1 بر روی فرم ما قرار داره، کد زیر رو برای رویدادهای TextChanged و KeyPress اضافه کنید. کد زیر داخل Constructor فرم نوشته شده:

public Form1()
{
    InitializeComponent();
    var callTextChange = true;
    textBox1.TextChanged += (sender, args) =>
    {
        if (!callTextChange)
            return;
        var textBox = (TextBox)sender;
        var selectionIsLast = textBox.SelectionStart == textBox1.TextLength;
        var lastSelectionStart = textBox.Text.Length - textBox1.SelectionStart;
        var numberText = textBox.Text.Replace(",", "");
        var newText = string.Empty;
        var separatorFlag = 0;
        for (var counter = numberText.Length - 1; counter >= 0; counter--)
        {
            newText = newText + numberText[counter];
            separatorFlag++;
            if (separatorFlag == 3 && counter == 0)
                break;
            if (separatorFlag != 3)
                continue;
            newText = newText + ',';
            separatorFlag = 0;
        }
        callTextChange = false;
        textBox.Text = string.Join("", newText.Reverse());
        callTextChange = true;
        if (selectionIsLast)
            textBox.SelectionStart = textBox.TextLength;
        else
            textBox.SelectionStart = textBox.TextLength < lastSelectionStart ? 0 : textBox.TextLength - lastSelectionStart;
    };
    textBox1.KeyPress += (sender, args) =>
    {
        if (char.IsDigit(args.KeyChar) || args.KeyChar == '\b')
            return;
        args.Handled = true;
    };
}

نمونه اجرای برنامه:

نمونه اجرای برنامه Digit Group