سؤال

وأنا أفعل تطبيق WinForms عناصر المالية وأواجه بعض المتاعب مع الضوابط.

والعملاء بلدي يحتاج لادخال قيم عشرية في كل مكان (الأسعار، خصومات الخ) وأود أن تجنب بعض التحقق من صحة تكرار.

ولذا فإنني على الفور حاول MaskedTextBox التي من شأنها أن تناسب احتياجاتي (مع قناع مثل "00000.00 €")، لو لم يكن للتركيز وطول القناع.

وأنا لا يمكن أن يتنبأ كيف كبيرة الأرقام هي بلدي العملاء سوف تدخل حيز التطبيق.

وأنا أيضا لا يمكن أن نتوقع منه أن يبدأ كل شيء مع 00 للوصول الى الفاصلة. كل شيء يجب أن تكون ودية لوحة المفاتيح.

وأنا شيء مفقود أو هناك ببساطة أي وسيلة (بعد كتابة عنصر تحكم مخصص) لتحقيق هذا الأمر مع المعيار عناصر تحكم Windows Forms؟

هل كانت مفيدة؟

المحلول

وهذه طريقتين متجاوزة فعل ذلك بالنسبة لي (تنويه: هذا الرمز ليست في الإنتاج بعد قد تحتاج إلى تعديل.)

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (!char.IsNumber(e.KeyChar) & (Keys)e.KeyChar != Keys.Back 
            & e.KeyChar != '.')
        {
            e.Handled = true;
        }

        base.OnKeyPress(e);
    }

    private string currentText;

    protected override void OnTextChanged(EventArgs e)
    {
        if (this.Text.Length > 0)
        {
            float result;
            bool isNumeric = float.TryParse(this.Text, out result);

            if (isNumeric)
            {
                currentText = this.Text;
            }
            else
            {
                this.Text = currentText;
                this.Select(this.Text.Length, 0);
            }
        }
        base.OnTextChanged(e);
    }

نصائح أخرى

وسوف تحتاج عنصر تحكم مخصص. مجرد فخ الحدث التحقق من صحة على مراقبة ومعرفة ما اذا كان إدخال سلسلة يمكن تحليل كعدد عشري.

وأنا لا أعتقد أنك بحاجة إلى التحكم المخصصة، والكتابة فقط وسيلة عشري التحقق من صحة لهذا الحدث التأكد من صحتها واستخدام ذلك لجميع الأماكن التي تحتاج إلى التحقق من صحة. لا تنسى أن تشمل NumberFormatInfo ، فإنه سنتعامل مع الفواصل وعلامات numebr.

وتحتاج فقط للسماح أرقام ورموز عشرية من خلال، وتجنب الرمز العشري مزدوج. كما اضافية، وهذا يضيف تلقائيا 0 قبل عدد عشري ابتداء.

public class DecimalBox : TextBox
{
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (e.KeyChar == ',')
        {
            e.KeyChar = '.';
        }

        if (!char.IsNumber(e.KeyChar) && (Keys)e.KeyChar != Keys.Back && e.KeyChar != '.')
        {
            e.Handled = true;
        }

        if(e.KeyChar == '.' )
        {
            if (this.Text.Length == 0)
            {
                this.Text = "0.";
                this.SelectionStart = 2;
                e.Handled = true;
            }
            else if (this.Text.Contains("."))
            {
                e.Handled = true;
            }
        }

        base.OnKeyPress(e);
    }
}

وثمة نهج آخر هو لمنع ما كنت لا تريد، والتنسيق عند القيام به مع ذلك.

class DecimalTextBox : TextBox
{
    // Handle multiple decimals
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (e.KeyChar == '.')
            if (this.Text.Contains('.'))
                e.Handled = true;

        base.OnKeyPress(e);
    }

    // Block non digits
    // I scrub characters here instead of handling in OnKeyPress so I can support keyboard events (ctrl + c/v/a)
    protected override void OnTextChanged(EventArgs e)
    {
        this.Text = System.Text.RegularExpressions.Regex.Replace(this.Text, "[^.0-9]", "");
        base.OnTextChanged(e);
    }

    // Apply our format when we're done
    protected override void OnLostFocus(EventArgs e)
    {
        if (!String.IsNullOrEmpty(this.Text))
            this.Text = string.Format("{0:N}", Convert.ToDouble(this.Text));

        base.OnLostFocus(e);
    }


}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top