আমি কীভাবে এমন একটি পাঠ্যবক্স তৈরি করব যা কেবলমাত্র সংখ্যা গ্রহণ করে?


582

আমার কাছে একটি পাঠ্যবক্স নিয়ন্ত্রণ সহ একটি উইন্ডোজ ফর্ম অ্যাপ রয়েছে যা আমি কেবল পূর্ণসংখ্যার মানগুলি গ্রহণ করতে চাই। অতীতে আমি কীপ্রেস ইভেন্টটি ওভারলোড করে এবং নির্দিষ্টকরণের উপযুক্ত নয় এমন অক্ষরগুলি সরিয়ে দিয়ে এই ধরণের বৈধতা দিয়েছি। আমি মাস্কটেক্সটবক্স নিয়ন্ত্রণটি দেখেছি তবে আমি আরও একটি সাধারণ সমাধান চাই যা সম্ভবত নিয়মিত প্রকাশের সাথে কাজ করতে পারে বা অন্য নিয়ন্ত্রণের মানগুলির উপর নির্ভর করে।

আদর্শভাবে এটি এমন আচরণ করবে যে কোনও অ-সংখ্যাযুক্ত চরিত্রটি চাপলে ফল হয় না বা অবিলম্বে অবৈধ চরিত্রটি সম্পর্কে ব্যবহারকারীকে প্রতিক্রিয়া জানায়।


11
সংখ্যা বা সংখ্যা? বড় পার্থক্য: এমনকি পূর্ণসংখ্যারও নেতিবাচক হতে পারে
জোয়েল কোহোর্ন

8
প্রশ্নটি মূলত সংখ্যাগুলির পুরো সেট সহ সংখ্যার জন্য উদ্দিষ্ট ছিল।
মাইক্রফ্ট

উত্তর:


797

দুটি বিকল্প:

  1. NumericUpDownপরিবর্তে ব্যবহার করুন । নিউমারিকআপডাউন আপনার জন্য ফিল্টারিং করে যা দুর্দান্ত। অবশ্যই এটি আপনার ব্যবহারকারীদের বর্তমান মানকে বৃদ্ধি এবং হ্রাস করতে কীবোর্ডের উপরে এবং নীচে তীরগুলি আঘাত করার ক্ষমতা দেয় gives

  2. সংখ্যার ইনপুট ব্যতীত অন্য কোনও কিছু রোধ করতে যথাযথ কীবোর্ড ইভেন্টগুলি পরিচালনা করুন। আমি একটি স্ট্যান্ডার্ড টেক্সটবক্সে এই দুটি ইভেন্ট হ্যান্ডলারের সাথে সাফল্য পেয়েছি:

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) &&
            (e.KeyChar != '.'))
        {
                e.Handled = true;
        }
    
        // only allow one decimal point
        if ((e.KeyChar == '.') && ((sender as TextBox).Text.IndexOf('.') > -1))
        {
            e.Handled = true;
        }
    }

যদি আপনার টেক্সটবক্স দশমিক জায়গাগুলির অনুমতি না দেয় তবে আপনি চেকটি '.'(এবং একের অধিক পরবর্তী চেক '.') মুছে ফেলতে পারেন । '-'আপনার টেক্সটবক্সে নেতিবাচক মানগুলির অনুমোদন করা উচিত কিনা তা পরীক্ষা করেও আপনি যুক্ত করতে পারেন।

আপনি যদি সংখ্যার সংখ্যার জন্য ব্যবহারকারীকে সীমাবদ্ধ রাখতে চান তবে ব্যবহার করুন: textBox1.MaxLength = 2; // this will allow the user to enter only 2 digits


5
নিউমারিকআপডাউন সহ একমাত্র অপূর্ণতা হ'ল আপনি যখন সর্বাধিক বা ন্যূনতম অনুমোদিত মানগুলির বাইরে কোনও মান প্রবেশ করেন তখন কোনও প্রতিক্রিয়া প্রদান করে না - এটি আপনার টাইপ করা পরিবর্তনগুলি কেবল পরিবর্তন করে। একটি পাঠ্যবক্স কমপক্ষে অবৈধ মানগুলিকে অনুমতি দিতে পারে যাতে তারা যখন ফর্মটি জমা দেয় তখন আপনি ব্যবহারকারীকে সতর্ক করতে পারেন।
ম্যাট হ্যামিল্টন

7
এটি সত্য - ব্যবহারকারী সর্বদা কিছু অ-সংখ্যাযুক্ত অক্ষরে পেস্ট করতে পারে। আপনি আশা করবেন যে ফর্মের বৈধতাটি এটি ধরা পড়বে, যেহেতু কোনও পর্যায়ে আপনি কোনও Int32.TryParse বা কিছু করতে চান।
ম্যাট হ্যামিল্টন

52
'এর জন্য চেকগুলি প্রতিস্থাপন করে এটিকে বিশ্বায়ন করতে আপনার আরও কিছু প্রচেষ্টা প্রয়োজন হবে। কালচারআইনফো.কন্টেনক্রালচার.নম্বার ফর্ম্যাট.নম্বার ডেসিমেলসপেটর উপর চেক সহ।
জেফ ইয়েটস

6
@ হামিশগ্রিবিজান, ইসকন্ট্রোলের নিয়ন্ত্রণ কীটির সাথে কোনও সম্পর্ক নেই; এটি কোনও চর একটি নিয়ন্ত্রণ চর কিনা তা ফেরত দেয়। কন্ট্রোল চরগুলিকে অনুমতি দিয়ে আপনি ব্যাকস্পেস, ডিলিট বা তীর কীগুলির মতো জিনিসগুলি ভাঙবেন না
টমাস লেভস্ক

13
এটি এখনও অবৈধ সিআরটিএল + ভি ইনপুট গ্রহণ করে; এমন একটি বাগ যা এমনকি সরকারী সংখ্যাসূচক আপ নিয়ন্ত্রণে বিদ্যমান।
নায়ারগডস

149

এবং কেবলমাত্র এক লাইনে স্টাফ করা আরও মজাদার কারণ ...

 private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        e.Handled = !char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar);
    }

দ্রষ্টব্য: এটি কোনও ব্যবহারকারীকে এই পাঠ্যবক্সে অনুলিপি / আটকানো থেকে বিরত রাখে না। এটি আপনার ডেটা স্যানিটাইজ করার কোনও ব্যর্থ নিরাপদ উপায় নয়।


এটি কোনও সাধারণ সমাধান নয় কারণ এটি কেবলমাত্র সংখ্যার জন্য কাজ করে। আমাকে সম্প্রতি এ জাতীয় জিনিসটি বাস্তবায়ন করতে হয়েছিল এবং আমি চেষ্টা করেছি
পার্সিংয়ের

1
যখন একাধিক পদ্ধতি KeyPressএকই পাঠ্য বাক্স থেকে ইভেন্টগুলি পরিচালনা করে তখন এটি কাজ করতে পারে না । একটি ইভেন্ট সত্যতে সেট e.Handledহয়ে যেতে পারে এবং অন্য কোনওটি এটি আবার মিথ্যাতে সেট করতে পারে। সাধারণভাবে, এটি ব্যবহার করা আরও ভালif (...) e.Handled = true;
নাথানিয়েল জোনস

2
কীবোর্ড বা মেনু দ্বারা অনুলিপি পেস্ট প্রতিরোধ করতে আপনি শর্টকাটস সক্ষম সম্পত্তিটি অক্ষম করতে পারেন
আহমাদ

3
হা হা! হ্যাঁ! এক লাইনার!
জেমি এল।

3
অঁ্যা। একটি TextChangedইভেন্ট যা তার সাথে
রেজেক্সের

51

আমি প্রসঙ্গে এবং আপনি যে ট্যাগগুলি ব্যবহার করেছেন তা ধরে নিচ্ছি যে আপনি একটি নেট নেট # অ্যাপ লিখছেন। এই ক্ষেত্রে, আপনি পাঠ্য পরিবর্তিত ইভেন্টটিতে সদস্যতা নিতে পারেন এবং প্রতিটি কী স্ট্রোককে বৈধতা দিতে পারেন।

private void textBox1_TextChanged(object sender, EventArgs e)
{
    if (System.Text.RegularExpressions.Regex.IsMatch(textBox1.Text, "[^0-9]"))
    {
        MessageBox.Show("Please enter only numbers.");
        textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
    }
}

22
আপনি যদি একটি সংখ্যার মাঝখানে টাইপ করেন তবে এটি কি খুব অদ্ভুত প্রভাব দেবে না?
কলিন পিকার্ড

5
এবং এটিও হওয়া উচিত:textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
পিয়িনিয়াডজ

3
যদি প্রথম চরিত্রটি নিজেই একটি অঙ্ক না হয় ... তবে সেই ক্ষেত্রে 1 টি বিয়োগ করবে না ত্রুটি ছুঁড়ে ....
manu_dilip_shah

6
এছাড়াও, কীপ্রেসের পরিবর্তে টেক্সট চ্যাঞ্জড ব্যবহার করে কিছুটা পুনরাবৃত্তি তৈরি হয় যা সরান পদ্ধতির পরে কোডটি দ্বিতীয় পাঠ্য-পরিবর্তিত ইভেন্টে চলে যাবে।
ডব্লিউইএফএক্স

2
আপনি আপনার ইসম্যাচ ফাংশনের জন্য ইনপুট এবং প্যাটার্ন পরামিতিগুলি স্যুইচ করেছেন। ইনপুটটি প্রথমে, তারপরে প্যাটার্ন হওয়া উচিত। এমএসডিএন.মাইক্রোসফট.এইন.উস
লিবারি

36

এখানে একটি সাধারণ স্ট্যান্ডলোন উইনফর্মস কাস্টম নিয়ন্ত্রণ রয়েছে, এটি স্ট্যান্ডার্ড টেক্সটবক্স থেকে প্রাপ্ত, যা কেবলমাত্র System.Int32 ইনপুটকে অনুমতি দেয় (এটি সহজেই অন্যান্য ধরণের যেমন System.Int64 ইত্যাদির জন্য অভিযোজিত হতে পারে)। এটি অনুলিপি / পেস্ট পরিচালনা এবং নেতিবাচক সংখ্যা সমর্থন করে:

public class Int32TextBox : TextBox
{
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        base.OnKeyPress(e);

        NumberFormatInfo fi = CultureInfo.CurrentCulture.NumberFormat;

        string c = e.KeyChar.ToString();
        if (char.IsDigit(c, 0))
            return;

        if ((SelectionStart == 0) && (c.Equals(fi.NegativeSign)))
            return;

        // copy/paste
        if ((((int)e.KeyChar == 22) || ((int)e.KeyChar == 3))
            && ((ModifierKeys & Keys.Control) == Keys.Control))
            return;

        if (e.KeyChar == '\b')
            return;

        e.Handled = true;
    }

    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
        const int WM_PASTE = 0x0302;
        if (m.Msg == WM_PASTE)
        {
            string text = Clipboard.GetText();
            if (string.IsNullOrEmpty(text))
                return;

            if ((text.IndexOf('+') >= 0) && (SelectionStart != 0))
                return;

            int i;
            if (!int.TryParse(text, out i)) // change this for other integer types
                return;

            if ((i < 0) && (SelectionStart != 0))
                return;
        }
        base.WndProc(ref m);
    }

আপডেট 2017 : আমার প্রথম উত্তরে কিছু সমস্যা রয়েছে:

  • আপনি প্রদত্ত প্রকারের পূর্ণসংখ্যার চেয়ে লম্বা এমন কিছু টাইপ করতে পারেন (উদাহরণস্বরূপ 2147483648 Int32.MaxValue এর চেয়ে বড়);
  • আরও সাধারণভাবে, যা টাইপ করা হয়েছে তার ফলাফলের প্রকৃত বৈধতা নেই ;
  • এটি কেবল int32 পরিচালনা করে, আপনাকে প্রতিটি ধরণের জন্য নির্দিষ্ট পাঠ্যবক্স ডেরিভেটেড নিয়ন্ত্রণ লিখতে হবে (Int64 ইত্যাদি)

সুতরাং আমি আরও একটি সাধারণ সংস্করণ নিয়ে এসেছি যা আরও সাধারণ, যা এখনও অনুলিপি / পেস্ট, + এবং - সাইন ইত্যাদি সমর্থন করে

public class ValidatingTextBox : TextBox
{
    private string _validText;
    private int _selectionStart;
    private int _selectionEnd;
    private bool _dontProcessMessages;

    public event EventHandler<TextValidatingEventArgs> TextValidating;

    protected virtual void OnTextValidating(object sender, TextValidatingEventArgs e) => TextValidating?.Invoke(sender, e);

    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if (_dontProcessMessages)
            return;

        const int WM_KEYDOWN = 0x100;
        const int WM_ENTERIDLE = 0x121;
        const int VK_DELETE = 0x2e;

        bool delete = m.Msg == WM_KEYDOWN && (int)m.WParam == VK_DELETE;
        if ((m.Msg == WM_KEYDOWN && !delete) || m.Msg == WM_ENTERIDLE)
        {
            DontProcessMessage(() =>
            {
                _validText = Text;
                _selectionStart = SelectionStart;
                _selectionEnd = SelectionLength;
            });
        }

        const int WM_CHAR = 0x102;
        const int WM_PASTE = 0x302;
        if (m.Msg == WM_CHAR || m.Msg == WM_PASTE || delete)
        {
            string newText = null;
            DontProcessMessage(() =>
            {
                newText = Text;
            });

            var e = new TextValidatingEventArgs(newText);
            OnTextValidating(this, e);
            if (e.Cancel)
            {
                DontProcessMessage(() =>
                {
                    Text = _validText;
                    SelectionStart = _selectionStart;
                    SelectionLength = _selectionEnd;
                });
            }
        }
    }

    private void DontProcessMessage(Action action)
    {
        _dontProcessMessages = true;
        try
        {
            action();
        }
        finally
        {
            _dontProcessMessages = false;
        }
    }
}

public class TextValidatingEventArgs : CancelEventArgs
{
    public TextValidatingEventArgs(string newText) => NewText = newText;
    public string NewText { get; }
}

ইন্ট 32 এর জন্য আপনি এটি থেকে এটি পেতে পারেন:

public class Int32TextBox : ValidatingTextBox
{
    protected override void OnTextValidating(object sender, TextValidatingEventArgs e)
    {
        e.Cancel = !int.TryParse(e.NewText, out int i);
    }
}

বা ডাব্লু / ও ডেরিভেশন, নতুন টেক্সটভালিডিং ইভেন্টটি ব্যবহার করুন:

var vtb = new ValidatingTextBox();
...
vtb.TextValidating += (sender, e) => e.Cancel = !int.TryParse(e.NewText, out int i);

তবে কি সুন্দর এটি কোনও স্ট্রিং এবং যে কোনও বৈধতা রুটিনের সাথে কাজ করে।


এটি দুর্দান্ত, দুর্দান্ত এবং সহজ, সহজেই ব্যবহৃত হয়েছে এবং অস্বাভাবিক ইনপুট প্রচেষ্টাগুলির সাথে কাজ করে। ধন্যবাদ!
ওয়্যার্ডইয়ার্প

1
2017 সংস্করণে দ্রষ্টব্য, যখন একটি মান রয়েছে উদাহরণ 1 এবং আপনি ব্যাকস্পেসে আঘাত করেন তবে আপনি যদি 120 বলে থাকেন এবং তিনবার ব্যাকস্পেসে আঘাত করেন তবে আমরা 1 রেখে গেছি
কারেন পেইন

1
আপনার ভ্যালিডিটিং টেক্সটবক্সটি আমি কিছু সময়ের জন্য দেখেছি সেরা বাস্তবায়ন এখন অবধি। সহজ এবং কার্যকর। ধন্যবাদ!
স্যামুয়েল

19

বৈধীকৃত / যাচাইকরণ ইভেন্টগুলি ঠিক এটির জন্যই ডিজাইন করা হয়েছিল।

এই বিষয়টিতে এমএসডিএন নিবন্ধটি এখানে রয়েছে: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.uthorating.aspx

টিএল; ডিআর সংস্করণ: বৈধকরণ ইভেন্টে পাঠ্য সম্পত্তিটি পরীক্ষা করুন এবং e.Cancel=Trueডেটা অবৈধ হলে সেট করুন ।

আপনি যখন e.Cancel = সেট করেন, ব্যবহারকারী ক্ষেত্রটি ছেড়ে যেতে পারে না, তবে আপনাকে তাদের কিছু প্রকার প্রতিক্রিয়া জানাতে হবে যা কিছু ভুল। আমি কোনও সমস্যা চিহ্নিত করার জন্য বাক্সের পটভূমির রঙ হালকা লালতে পরিবর্তন করি। এটিকে আবার সেট করতে ভুলবেন নাSystemColors.Windowযখন ভ্যালিডিটিংকে একটি ভাল মান বলা তখন ।


1
খুব এপিআই-আইডিয়োম্যাটিক পদ্ধতির উল্লেখ করার জন্য +1। আমি উইন্ডোজ ফর্মগুলির তুলনায় তুলনামূলকভাবে নতুন এবং এটি কার্যকারিতা এবং এমএসডিএন ডক্সের বেশ জঙ্গল, তাই নির্দিষ্ট ডক পয়েন্টারটির জন্যও ধন্যবাদ Validating<nitpick>ওপি উল্লেখ করেছে যে অবিলম্বে একটি অবৈধ চরিত্রটিকে অস্বীকার / নির্দেশ করা আদর্শ, তবে Validatingএটি কার্যকর হওয়ার আগেই অন্য ফর্ম / নিয়ন্ত্রণে ফোকাস নেওয়া দরকার বলে মনে হয়। </nitpick>তবুও, এটি একটি দুর্দান্ত পদ্ধতি এবং আরও সাধারণ ক্ষেত্রে সর্বদা বিবেচনাযোগ্য।
উইলিয়াম

13

একটি মাস্কটেক্সটবক্স চেষ্টা করে দেখুন । এটি একটি সাধারণ মাস্ক ফর্ম্যাট লাগে যাতে আপনি ইনপুটটিকে সংখ্যা বা তারিখ বা যে কোনও কিছুতে সীমাবদ্ধ করতে পারেন।


2
আমি বিশেষত একটি মাস্কটেক্সটবক্স ব্যবহার করতে চাই না। তারা যে ফর্ম্যাটগুলি মঞ্জুরি দেয় তা খুব সীমাবদ্ধ হতে পারে। তারা এই ক্ষেত্রে কাজ করে তবে আমি আরও সাধারণ কিছু করতে চাই।
মাইক্রফট

12

আপনি TextChangedইভেন্টটি ব্যবহার করতে পারেন

private void textBox_BiggerThan_TextChanged(object sender, EventArgs e)
{
    long a;
    if (! long.TryParse(textBox_BiggerThan.Text, out a))
    {
        // If not int clear textbox text or Undo() last operation
        textBox_LessThan.Clear();
    }
}

দেখে মনে হচ্ছে এটি ব্যবহার করা ভাল কাজ করা উচিত Undo(), তবে এটির ফলস্বরূপ StackOverflowException
ড্রু চ্যাপিন

দেখে মনে হচ্ছে যে টেক্সট চেঞ্জড প্রিউটি হ'ল রুটিনের একটি অংশ যা আপনি পূর্বাবস্থায় ফিরে যেতে চান ()। আমার পুরো উইন্ডোটির জন্য পরিবর্তনশীল রয়েছে এবং আমি ব্যবহার করছি public int txtBoxValue, এবং যদি চেষ্টা করুন পার্সে কাজ না করে, আমি টেক্সটবক্সে টেক্সটটি ফিরিয়ে দিয়েছিtxtBox.Text = txtBoxValue.ToString();
এল জেদা

8

এটি দরকারী হতে পারে। এটি সঠিক দশমিক পয়েন্ট এবং পূর্ববর্তী প্লাস বা বিয়োগ চিহ্ন সহ "আসল" সংখ্যাসূচক মানগুলিকে অনুমতি দেয়। সম্পর্কিত কীপ্রেস ইভেন্টের মধ্যে থেকে এটিকে কল করুন।

       private bool IsOKForDecimalTextBox(char theCharacter, TextBox theTextBox)
    {
        // Only allow control characters, digits, plus and minus signs.
        // Only allow ONE plus sign.
        // Only allow ONE minus sign.
        // Only allow the plus or minus sign as the FIRST character.
        // Only allow ONE decimal point.
        // Do NOT allow decimal point or digits BEFORE any plus or minus sign.

        if (
            !char.IsControl(theCharacter)
            && !char.IsDigit(theCharacter)
            && (theCharacter != '.')
            && (theCharacter != '-')
            && (theCharacter != '+')
        )
        {
            // Then it is NOT a character we want allowed in the text box.
            return false;
        }



        // Only allow one decimal point.
        if (theCharacter == '.'
            && theTextBox.Text.IndexOf('.') > -1)
        {
            // Then there is already a decimal point in the text box.
            return false;
        }

        // Only allow one minus sign.
        if (theCharacter == '-'
            && theTextBox.Text.IndexOf('-') > -1)
        {
            // Then there is already a minus sign in the text box.
            return false;
        }

        // Only allow one plus sign.
        if (theCharacter == '+'
            && theTextBox.Text.IndexOf('+') > -1)
        {
            // Then there is already a plus sign in the text box.
            return false;
        }

        // Only allow one plus sign OR minus sign, but not both.
        if (
            (
                (theCharacter == '-')
                || (theCharacter == '+')
            )
            && 
            (
                (theTextBox.Text.IndexOf('-') > -1)
                ||
                (theTextBox.Text.IndexOf('+') > -1)
            )
            )
        {
            // Then the user is trying to enter a plus or minus sign and
            // there is ALREADY a plus or minus sign in the text box.
            return false;
        }

        // Only allow a minus or plus sign at the first character position.
        if (
            (
                (theCharacter == '-')
                || (theCharacter == '+')
            )
            && theTextBox.SelectionStart != 0
            )
        {
            // Then the user is trying to enter a minus or plus sign at some position 
            // OTHER than the first character position in the text box.
            return false;
        }

        // Only allow digits and decimal point AFTER any existing plus or minus sign
        if  (
                (
                    // Is digit or decimal point
                    char.IsDigit(theCharacter)
                    ||
                    (theCharacter == '.')
                )
                &&
                (
                    // A plus or minus sign EXISTS
                    (theTextBox.Text.IndexOf('-') > -1)
                    ||
                    (theTextBox.Text.IndexOf('+') > -1)
                )
                &&
                    // Attempting to put the character at the beginning of the field.
                    theTextBox.SelectionStart == 0
            )
        {
            // Then the user is trying to enter a digit or decimal point in front of a minus or plus sign.
            return false;
        }

        // Otherwise the character is perfectly fine for a decimal value and the character
        // may indeed be placed at the current insertion position.
        return true;
    }

6

উইনফর্মগুলিতে হারিয়ে যাওয়া জিনিসগুলি সম্পূর্ণ করার জন্য আমি উপাদানগুলির সংগ্রহের কাজ করছি, এটি এখানে: অ্যাডভান্সড ফর্ম

বিশেষত এটি একটি রেজেক্স টেক্সটবক্সের ক্লাস

/// <summary>Represents a Windows text box control that only allows input that matches a regular expression.</summary>
public class RegexTextBox : TextBox
{
    [NonSerialized]
    string lastText;

    /// <summary>A regular expression governing the input allowed in this text field.</summary>
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public virtual Regex Regex { get; set; }

    /// <summary>A regular expression governing the input allowed in this text field.</summary>
    [DefaultValue(null)]
    [Category("Behavior")]
    [Description("Sets the regular expression governing the input allowed for this control.")]
    public virtual string RegexString {
        get {
            return Regex == null ? string.Empty : Regex.ToString();
        }
        set {
            if (string.IsNullOrEmpty(value))
                Regex = null;
            else
                Regex = new Regex(value);
        }
    }

    protected override void OnTextChanged(EventArgs e) {
        if (Regex != null && !Regex.IsMatch(Text)) {
            int pos = SelectionStart - Text.Length + (lastText ?? string.Empty).Length;
            Text = lastText;
            SelectionStart = Math.Max(0, pos);
        }

        lastText = Text;

        base.OnTextChanged(e);
    }
}

কেবল এই জাতীয় কিছু যুক্ত myNumbericTextBox.RegexString = "^(\\d+|)$";করা যথেষ্ট।


5

কেবল একটি NumericUpDownনিয়ন্ত্রণ ব্যবহার করুন এবং সেগুলিকে আপ কমে যাওয়া আপ বোতামগুলির দৃশ্যমানতা সেট করুন false

numericUpDown1.Controls[0].Visible = false;

NumericUpDown আসলে এটি 'স্পিন বক্স' (ডাউন বোতামগুলি), একটি পাঠ্য বাক্স এবং এটিকে একসাথে বৈধকরণ এবং জঞ্জাল করার জন্য কিছু কোডযুক্ত নিয়ন্ত্রণগুলির সংগ্রহ।

চিহ্নিত:

YourNumericUpDown.Controls[0].visible = false 

অন্তর্নিহিত কোডটি সক্রিয় রাখার সময় বোতামগুলি আড়াল করবে।

একটি সুস্পষ্ট সমাধান না হয়েও এটি সহজ এবং কার্যকর। .Controls[1]আপনি যদি পরিবর্তে এটি করতে চান তবে পাঠ্য বাক্স অংশটি লুকিয়ে রাখবেন।


গৃহীত উত্তরে কীভাবে আপ ডাউন ডাউন বোতামগুলি সরিয়ে ফেলা যায়, কীভাবে এটি করা যায় তা স্পষ্ট নয় কারণ এগুলি সক্ষম বা অক্ষম করার মতো কোনও মানব পাঠযোগ্য ইন্টারফেস নেই। নিউমারিকআপডাউন আসলে একটি পাঠ্য বাক্স এবং একটি "স্পিন বক্স" (ডাউন বোতাম) এবং কিছু কোড হ্যান্ডলিং ইনপুট বৈধতা ধারণ করে এমন একটি নিয়ন্ত্রণের সংগ্রহ।
ব্যবহারকারী 2163234

4

আমি কোডপ্লেক্সে এর জন্য কিছু তৈরি করেছি ।

এটি টেক্সট চেঞ্জড ইভেন্টটি বাধা দিয়ে কাজ করে। ফলাফলটি যদি একটি ভাল নম্বর হয় তবে এটি সংরক্ষণ করা হবে। যদি এটি কিছু ভুল হয় তবে শেষ ভাল মানটি পুনরুদ্ধার করা হবে। উত্সটি এখানে প্রকাশের জন্য কিছুটা বড়, তবে এখানে শ্রেণীর একটি লিঙ্ক রয়েছে যা এই যুক্তির মূলটি পরিচালনা করে।


4

এই কোডটি কেবল টেক্সটবক্সে ব্যবহার করুন:

private void textBox1_TextChanged(object sender, EventArgs e)
{

    double parsedValue;

    if (!double.TryParse(textBox1.Text, out parsedValue))
    {
        textBox1.Text = "";
    }
}

4

পাঠ্যবক্সের সংজ্ঞা সহ আমাদের ওয়েবপৃষ্ঠায় আমরা onkeypressকেবল সংখ্যা গ্রহণের জন্য একটি ইভেন্ট যুক্ত করতে পারি । এটি কোনও বার্তা প্রদর্শন করবে না তবে এটি আপনাকে ভুল ইনপুট থেকে আটকাবে। এটি আমার পক্ষে কাজ করেছে, ব্যবহারকারী সংখ্যা ব্যতীত আর কিছু প্রবেশ করতে পারেনি।

<asp:TextBox runat="server" ID="txtFrom"
     onkeypress="if(isNaN(String.fromCharCode(event.keyCode))) return false;">


2

আমি কীডাউন ইভেন্টে এটি পরিচালনা করব।

void TextBox_KeyDown(object sender, KeyEventArgs e)
        {
            char c = Convert.ToChar(e.PlatformKeyCode);
            if (!char.IsDigit(c))
            {
                e.Handled = true;
            }
        }

2
"ব্যাকস্পেস", "মুছুন", "তীর-কী-বাম", "তীর-কী-রাইট", অনুলিপি এবং পেস্ট করুন,
নুমপ্যাড

শুধু এই মত আরো কয়েকটি পরীক্ষার যোগ করুন: যদি (!! Char.IsDigit (গ) && গ = (গৃহস্থালির কাজ করা) Keys.Back)
dnennis

2
private void txt3_KeyPress(object sender, KeyPressEventArgs e)
{
    for (int h = 58; h <= 127; h++)
    {
        if (e.KeyChar == h)             //58 to 127 is alphabets tat will be         blocked
        {
            e.Handled = true;
        }
    }
    for(int k=32;k<=47;k++)
    {
        if (e.KeyChar == k)              //32 to 47 are special characters tat will 
        {                                  be blocked
            e.Handled = true;
        }
    }
}

এটি খুব সহজ চেষ্টা করুন


2

উইনফোর্মে ইনপুট হ্যান্ডলিংটি একবার দেখুন

আমি আমার সমাধান পোস্ট করেছি যা পাঠ্যবক্সে প্রসেসসিএমডিকি এবং অনকাইপ্রেস ইভেন্টগুলি ব্যবহার করে। মন্তব্যগুলি আপনাকে কী-টিপস যাচাই করতে একটি রেজেেক্স ব্যবহার করতে এবং যথাযথভাবে অবরুদ্ধ করতে / অনুমতি দিতে দেখায়।


2

হাই আপনি পাঠ্যবক্সের পাঠ্য পরিবর্তিত ইভেন্টে এর মতো কিছু করতে পারেন।

এখানে একটি ডেমো

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        string actualdata = string.Empty;
        char[] entereddata = textBox1.Text.ToCharArray();
        foreach (char aChar in entereddata.AsEnumerable())
        {
            if (Char.IsDigit(aChar))
            {
                actualdata = actualdata + aChar;
                // MessageBox.Show(aChar.ToString());
            }
            else
            {
                MessageBox.Show(aChar + " is not numeric");
                actualdata.Replace(aChar, ' ');
                actualdata.Trim();
            }
        }
        textBox1.Text = actualdata;
    }

ধন্যবাদ, এটি খুব দরকারী।
কিরণ আরএস

2

দেখে মনে হচ্ছে এই প্রশ্নের বর্তমান অনেক উত্তর ম্যানুয়ালি ইনপুট পাঠ্যকে বিশ্লেষণ করছে। যদি আপনি কোনও নির্দিষ্ট অন্তর্নির্মিত সংখ্যার প্রকারের (যেমন intবা double) সন্ধান করেন তবে কেন কেবল সেই ধরণের TryParseপদ্ধতিতে কাজটি অর্পণ করবেন না ? উদাহরণ স্বরূপ:

public class IntTextBox : TextBox
{
    string PreviousText = "";
    int BackingResult;

    public IntTextBox()
    {
        TextChanged += IntTextBox_TextChanged;
    }

    public bool HasResult { get; private set; }

    public int Result
    {
        get
        {
            return HasResult ? BackingResult : default(int);
        }
    }

    void IntTextBox_TextChanged(object sender, EventArgs e)
    {
        HasResult = int.TryParse(Text, out BackingResult);

        if (HasResult || string.IsNullOrEmpty(Text))
        {
            // Commit
            PreviousText = Text;
        }
        else
        {
            // Revert
            var changeOffset = Text.Length - PreviousText.Length;
            var previousSelectionStart =
                Math.Max(0, SelectionStart - changeOffset);

            Text = PreviousText;
            SelectionStart = previousSelectionStart;
        }
    }
}

আপনি যদি আরও সাধারণ কিছু চান তবে ভিজ্যুয়াল স্টুডিওর ডিজাইনারের সাথে সামঞ্জস্যপূর্ণ:

public class ParsableTextBox : TextBox
{
    TryParser BackingTryParse;
    string PreviousText = "";
    object BackingResult;

    public ParsableTextBox()
        : this(null)
    {
    }

    public ParsableTextBox(TryParser tryParse)
    {
        TryParse = tryParse;

        TextChanged += ParsableTextBox_TextChanged;
    }

    public delegate bool TryParser(string text, out object result);

    public TryParser TryParse
    {
        set
        {
            Enabled = !(ReadOnly = value == null);

            BackingTryParse = value;
        }
    }

    public bool HasResult { get; private set; }

    public object Result
    {
        get
        {
            return GetResult<object>();
        }
    }

    public T GetResult<T>()
    {
        return HasResult ? (T)BackingResult : default(T);
    }

    void ParsableTextBox_TextChanged(object sender, EventArgs e)
    {
        if (BackingTryParse != null)
        {
            HasResult = BackingTryParse(Text, out BackingResult);
        }

        if (HasResult || string.IsNullOrEmpty(Text))
        {
            // Commit
            PreviousText = Text;
        }
        else
        {
            // Revert
            var changeOffset = Text.Length - PreviousText.Length;
            var previousSelectionStart =
                Math.Max(0, SelectionStart - changeOffset);

            Text = PreviousText;
            SelectionStart = previousSelectionStart;
        }
    }
}

এবং পরিশেষে, আপনি যদি পুরোপুরি জেনারেল কিছু চান এবং ডিজাইনার সহায়তা সম্পর্কে চিন্তা না করেন:

public class ParsableTextBox<T> : TextBox
{
    TryParser BackingTryParse;
    string PreviousText;
    T BackingResult;

    public ParsableTextBox()
        : this(null)
    {
    }

    public ParsableTextBox(TryParser tryParse)
    {
        TryParse = tryParse;

        TextChanged += ParsableTextBox_TextChanged;
    }

    public delegate bool TryParser(string text, out T result);

    public TryParser TryParse
    {
        set
        {
            Enabled = !(ReadOnly = value == null);

            BackingTryParse = value;
        }
    }

    public bool HasResult { get; private set; }

    public T Result
    {
        get
        {
            return HasResult ? BackingResult : default(T);
        }
    }

    void ParsableTextBox_TextChanged(object sender, EventArgs e)
    {
        if (BackingTryParse != null)
        {
            HasResult = BackingTryParse(Text, out BackingResult);
        }

        if (HasResult || string.IsNullOrEmpty(Text))
        {
            // Commit
            PreviousText = Text;
        }
        else
        {
            // Revert
            var changeOffset = Text.Length - PreviousText.Length;
            var previousSelectionStart =
                Math.Max(0, SelectionStart - changeOffset);

            Text = PreviousText;
            SelectionStart = previousSelectionStart;
        }
    }
}

2

Inteণাত্মক সংখ্যাগুলি সহ পূর্ণসংখ্যা এবং ফ্লোট উভয়ই গ্রহণ করা দরকার need

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    // Text
    string text = ((Control) sender).Text;

    // Is Negative Number?
    if (e.KeyChar == '-' && text.Length == 0)
    {
        e.Handled = false;
        return;
    }

    // Is Float Number?
    if (e.KeyChar == '.' && text.Length > 0 && !text.Contains("."))
    {
        e.Handled = false;
        return;
    }

    // Is Digit?
    e.Handled = (!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar));
}

2

এটি আমার অপ্রোচ:

  1. লিনাক ব্যবহার (ফিল্টার পরিবর্তন করা সহজ)
  2. প্রমাণ কোড কপি / পেস্ট করুন
  3. আপনি নিষিদ্ধ চরিত্রটি চাপলে ক্যারেট অবস্থান রাখে
  4. বাম জিরো গ্রহণ করে
  5. এবং যে কোনও আকারের সংখ্যা

    private void numeroCuenta_TextChanged(object sender, EventArgs e)
    {
        string org = numeroCuenta.Text;
        string formated = string.Concat(org.Where(c => (c >= '0' && c <= '9')));
        if (formated != org)
        {
            int s = numeroCuenta.SelectionStart;
            if (s > 0 && formated.Length > s && org[s - 1] != formated[s - 1]) s--;
            numeroCuenta.Text = formated;
            numeroCuenta.SelectionStart = s;
        }
    }

2

ফ্যাবিও ইত্তির উত্তরে বর্ণিত পদ্ধতির সাহায্যে আমি আরও সাধারণ সমাধান তৈরি করেছি:

public abstract class ValidatedTextBox : TextBox {
    private string m_lastText = string.Empty;
    protected abstract bool IsValid(string text);
    protected sealed override void OnTextChanged(EventArgs e) {
        if (!IsValid(Text)) {
            var pos = SelectionStart - Text.Length + m_lastText.Length;
            Text = m_lastText;
            SelectionStart = Math.Max(0, pos);
        }
        m_lastText = Text;
        base.OnTextChanged(e);
    }
}

"ভ্যালিডেটেডটেক্সটবক্স", যাতে সমস্ত অনিয়ন্ত্রিত বৈধতা আচরণ থাকে। যা করা বাকি রয়েছে তা এই শ্রেণীর উত্তরাধিকার সূত্রে প্রাপ্ত এবং বৈধতা যুক্তি যা প্রয়োজন তার সাথে "ইসওয়ালিড" পদ্ধতি ওভাররাইড করে। উদাহরণস্বরূপ, এই শ্রেণিটি ব্যবহার করে, "RegexedTextBox" তৈরি করা সম্ভব যা নির্দিষ্ট স্ট্রিংগুলিকে নির্দিষ্ট নিয়মিত অভিব্যক্তির সাথে মিলবে কেবল তা গ্রহণ করবে:

public abstract class RegexedTextBox : ValidatedTextBox {
    private readonly Regex m_regex;
    protected RegexedTextBox(string regExpString) {
        m_regex = new Regex(regExpString);
    }
    protected override bool IsValid(string text) {
        return m_regex.IsMatch(Text);
    }
}

তারপরে, "রেজেক্সডটেক্সটবক্স" শ্রেণি থেকে উত্তরাধিকার সূত্রে আমরা সহজেই "পজিটিভ নাম্বারটেক্সটবক্স" এবং "পজিটিভফ্লোটিং পয়েন্টনम्बरটেক্সটবক্স" নিয়ন্ত্রণগুলি তৈরি করতে পারি:

public sealed class PositiveNumberTextBox : RegexedTextBox {
    public PositiveNumberTextBox() : base(@"^\d*$") { }
}

public sealed class PositiveFloatingPointNumberTextBox : RegexedTextBox {
    public PositiveFloatingPointNumberTextBox()
        : base(@"^(\d+\" + CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator + @")?\d*$") { }
}

1

মৃতদের জাগিয়ে তোলার জন্য দুঃখিত, তবে আমি ভেবেছিলাম ভবিষ্যতের রেফারেন্সের জন্য কেউ এটি দরকারী খুঁজে পেতে পারেন।

এখানে আমি এটি পরিচালনা করি। এটি ভাসমান পয়েন্ট সংখ্যাগুলি পরিচালনা করে তবে সহজেই পূর্ণসংখ্যার জন্য পরিবর্তন করা যায়।

মূলত আপনি কেবল 0 - 9 এবং টিপতে পারেন

আপনার কাছে কেবলমাত্র 0 আগে থাকতে পারে

অন্যান্য সমস্ত অক্ষর উপেক্ষা করা হয় এবং কার্সার অবস্থান বজায় থাকে।

    private bool _myTextBoxChanging = false;

    private void myTextBox_TextChanged(object sender, EventArgs e)
    {
        validateText(myTextBox);
    }

    private void validateText(TextBox box)
    {
        // stop multiple changes;
        if (_myTextBoxChanging)
            return;
        _myTextBoxChanging = true;

        string text = box.Text;
        if (text == "")
            return;
        string validText = "";
        bool hasPeriod = false;
        int pos = box.SelectionStart;
        for (int i = 0; i < text.Length; i++ )
        {
            bool badChar = false;
            char s = text[i];
            if (s == '.')
            {
                if (hasPeriod)
                    badChar = true;
                else
                    hasPeriod = true;
            }
            else if (s < '0' || s > '9')
                badChar = true;

            if (!badChar)
                validText += s;
            else
            {
                if (i <= pos)
                    pos--;
            }
        }

        // trim starting 00s
        while (validText.Length >= 2 && validText[0] == '0')
        {
            if (validText[1] != '.')
            {
                validText = validText.Substring(1);
                if (pos < 2)
                    pos--;
            }
            else
                break;
        }

        if (pos > validText.Length)
            pos = validText.Length;
        box.Text = validText;
        box.SelectionStart = pos;
        _myTextBoxChanging = false;
    }

এখানে একটি দ্রুত সংশোধিত ইন সংস্করণ দেওয়া হয়েছে:

    private void validateText(TextBox box)
    {
        // stop multiple changes;
        if (_myTextBoxChanging)
            return;
        _myTextBoxChanging = true;

        string text = box.Text;
        if (text == "")
            return;
        string validText = "";
        int pos = box.SelectionStart;
        for (int i = 0; i < text.Length; i++ )
        {
            char s = text[i];
            if (s < '0' || s > '9')
            {
                if (i <= pos)
                    pos--;
            }
            else
                validText += s;
        }

        // trim starting 00s 
        while (validText.Length >= 2 && validText.StartsWith("00")) 
        { 
            validText = validText.Substring(1); 
            if (pos < 2) 
                pos--; 
        } 

        if (pos > validText.Length)
            pos = validText.Length;
        box.Text = validText;
        box.SelectionStart = pos;
        _myTextBoxChanging = false;
    }

2
এই সমাধানটি ক্যাভ্যাট সহ চাকাটিকে পুনরায় উদ্বেগ করছে। উদাহরণস্বরূপ স্থানীয়করণ।
জুলিয়েন গের্টল্ট

1

এইটি অনুলিপি এবং পেস্ট, ড্রাগ এবং ড্রপ, কী নীচে, ওভারফ্লো প্রতিরোধ করে এবং খুব সহজ pretty

public partial class IntegerBox : TextBox 
{
    public IntegerBox()
    {
        InitializeComponent();
        this.Text = 0.ToString();
    }

    protected override void OnPaint(PaintEventArgs pe)
    {
        base.OnPaint(pe);
    }

    private String originalValue = 0.ToString();

    private void Integerbox_KeyPress(object sender, KeyPressEventArgs e)
    {
        originalValue = this.Text;
    }

    private void Integerbox_TextChanged(object sender, EventArgs e)
    {
        try
        {
            if(String.IsNullOrWhiteSpace(this.Text))
            {
                this.Text = 0.ToString();
            }
            this.Text = Convert.ToInt64(this.Text.Trim()).ToString();
        }
        catch (System.OverflowException)
        {
            MessageBox.Show("Value entered is to large max value: " + Int64.MaxValue.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            this.Text = originalValue;
        }
        catch (System.FormatException)
        {                
            this.Text = originalValue;
        }
        catch (System.Exception ex)
        {
            this.Text = originalValue;
            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK , MessageBoxIcon.Error);
        }
    }       
}

1

ভুলে যাবেন না যে কোনও ব্যবহারকারী একটিতে একটি অবৈধ পাঠ্য আটকে দিতে পারে TextBox

আপনি যদি এটি সীমাবদ্ধ রাখতে চান তবে নীচের কোডটি অনুসরণ করুন:

private void ultraTextEditor1_TextChanged(object sender, EventArgs e)
{
    string append="";
    foreach (char c in ultraTextEditor1.Text)
    {
        if ((!Char.IsNumber(c)) && (c != Convert.ToChar(Keys.Back)))
        {

        }
        else
        {
            append += c;
        }
    }

    ultraTextEditor1.Text = append;
}   

1

আমি কেবল পাঠ্যবক্সে সংখ্যা এবং কি-পিসের সমস্যাটি পরীক্ষা করার সর্বোত্তম উপায়টি সন্ধান করছিলাম এটি কি ডান ক্লিক বা ক্লিপবোর্ডের মাধ্যমে অনুলিপি পেস্ট সমর্থন করে না তাই এই কোডটি উপস্থিত হয়েছিল যা কার্সার পাঠ্য ক্ষেত্রটি ছেড়ে যাওয়ার সময় যাচাই করে এবং এটির জন্যও পরীক্ষা করে খালি মাঠ (নিউগুয়ের রূপান্তরিত সংস্করণ)

private void txtFirstValue_MouseLeave(object sender, EventArgs e)
{
    int num;
    bool isNum = int.TryParse(txtFirstValue.Text.Trim(), out num);

    if (!isNum && txtFirstValue.Text != String.Empty)
    {
        MessageBox.Show("The First Value You Entered Is Not a Number, Please Try Again", "Invalid Value Detected", MessageBoxButtons.OK, MessageBoxIcon.Error);
        txtFirstValue.Clear();
    }
}

মাউসলিভ মনে হয় কোনও ইভেন্টটি ব্যবহারের জন্য খুব খারাপ পছন্দ।
লার্সটেক

@ লার্সটেক যা আমি ভেবেছিলাম পাঠ্য পরিবর্তিত হয়েছিল তা এমনকি ব্যবহারকারী ত্রুটি বুঝতে পারে এবং এটি সমাধানের চেষ্টা করার আগেও ত্রুটি বার্তাবক্স তৈরি করতে পারে তাই আমি ভেবেছিলাম আমি আরও ভাল কাজ করব। আপনি কি মনে করেন যে এই ক্ষেত্রে সেরা ঘটনা?
অ্যালস্টন অ্যান্টনি

@ অ্যালস্টন অ্যান্টনি দেরীতে মন্তব্য করেছেন, আমি জানি। কিন্তু একটি সরল ক্লিক ইভেন্ট যা রাইটক্লিকের উপরে সক্রিয় এটি যথেষ্ট হবে না?
টাকারেই

0
int Number;
bool isNumber;
isNumber = int32.TryPase(textbox1.text, out Number);

if (!isNumber)
{ 
    (code if not an integer);
}
else
{
    (code if an integer);
}

0

3 সমাধান

1)

//Add to the textbox's KeyPress event
//using Regex for number only textBox

private void txtBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), "\\d+"))
e.Handled = true;
}

2) এমএসডিএন থেকে আর একটি সমাধান

// Boolean flag used to determine when a character other than a number is entered.
private bool nonNumberEntered = false;
// Handle the KeyDown event to determine the type of character entered into the     control.
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
// Initialize the flag to false.
nonNumberEntered = false;
// Determine whether the keystroke is a number from the top of the keyboard.
if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)
{
    // Determine whether the keystroke is a number from the keypad.
    if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9)
    {
        // Determine whether the keystroke is a backspace.
        if (e.KeyCode != Keys.Back)
        {
            // A non-numerical keystroke was pressed.
            // Set the flag to true and evaluate in KeyPress event.
            nonNumberEntered = true;
        }
    }
}

}

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (nonNumberEntered == true)
    {
       MessageBox.Show("Please enter number only..."); 
       e.Handled = true;
    }
}

সূত্র http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keypress(v=VS.90).aspx

3) মাস্কটেক্সটবক্স ব্যবহার করুন: http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.aspx


0

বোতামে ক্লিক করে আপনি লুপের মাধ্যমে পাঠ্যবক্সের পাঠ্য পরীক্ষা করতে পারেন:

char[] c = txtGetCustomerId.Text.ToCharArray();
bool IsDigi = true;

for (int i = 0; i < c.Length; i++)
     {
       if (c[i] < '0' || c[i] > '9')
      { IsDigi = false; }
     }
 if (IsDigi)
    { 
     // do something
    }

0

সহজ উত্তর:

_textBox.TextChanged += delegate(System.Object o, System.EventArgs e)
{
    TextBox _tbox = o as TextBox;
    _tbox.Text = new string(_tbox.Text.Where(c => (char.IsDigit(c)) || (c == '.')).ToArray());
};
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.