سؤال

أحتاج إلى مربع نص يمكن للمستخدم فقط السماح له بإدخال الأعداد الصحيحة.ولكن لا يمكن للمستخدم إدخال الصفر.أي أنه يمكنه إدخال 10100 وما إلى ذلك.ليس 0 وحده.كيف يمكنني إنشاء حدث في KeyDown؟

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

المحلول

والطريقة التي تخطط للقيام بذلك، أمر مزعج جدا للمستخدم. كنت التخمين ما يريد المستخدم للدخول، والتصرف بناء على تخمين، ولكن هل يمكن أن يكون ذلك خطأ.

وكما أن لديها الثقوب، على سبيل المثال، يمكن للمستخدم إدخال "10" ثم قم بحذف "1". أو أنه يمكن لصق في "0" - كنت تسمح عجينة، لا لك

وحتى بلدي الحل سيكون: دعه يدخل أي رقم يحب، أي الطريقة التي يحب، والتحقق من صحة المدخلات فقط <م> بعد انتهى، على سبيل المثال، عندما يفقد مدخلات التركيز

نصائح أخرى

لماذا لا تستخدم NumericUpDown وجعل الإعدادات التالية:

upDown.Minimum = 1;
upDown.Maximum = Decimal.MaxValue;

يستخدم int.TryParse لتحويل النص إلى رقم والتحقق مما إذا كان هذا الرقم ليس 0.استخدم ال التحقق من صحة حدث للشيك.

// this goes to you init routine
textBox1.Validating += textBox1_Validating;

// the validation method
private void textBox1_Validating(object sender, CancelEventArgs e)
{
    if (textBox1.Text.Length > 0)
    {
        int result;
        if (int.TryParse(textBox1.Text, out result))
        {
            // number is 0?
            e.Cancel = result == 0;
        }
        else
        {
            // not a number at all
            e.Cancel = true;
        }
    }
}

يحرر:

حسنًا، بما أنك تستخدم WPF، فيجب عليك إلقاء نظرة على كيفية التنفيذ التحقق من صحة طريقة WPF.فيما يلي فئة التحقق من الصحة التي تنفذ المنطق أعلاه:

public class StringNotZeroRule : ValidationRule
{
    public override ValidationResult Validate(object value, CultureInfo cultureInfo)
    {
        if (textBox1.Text.Length == 0)
            return new ValidationResult(true, null);

        int result;
        if (int.TryParse(textBox1.Text, out result))
        {
            // number is 0?
            if (result == 0)
            {
                return new ValidationResult(false, "0 is not allowed");
            }
        }
        else
        {
            // not a number at all
            return new ValidationResult(false, "not a number");
        }

        return new ValidationResult(true, null);
    }
}

وهذا هو اختلاف آخر حول موضوع:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    char newChar = Convert.ToChar(e.KeyValue);
    if (char.IsControl(newChar))
    {
        return;
    }
    int value;
    e.SuppressKeyPress = int.TryParse((sender as TextBox).Text + newChar.ToString(), out value) ? value == 0 : true;
}
    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (textBox1.Text == "" && e.KeyChar == '0')
        {
            e.Handled = true;
            return;
        }
        if (e.KeyChar < '0' || e.KeyChar > '9')
        {
            e.Handled = true;
            return;
        }

    }

وليس لطيفا ولكنه يعمل

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