سؤال

أنا مبرمج MFC وهو جديد في لغة C# وأبحث عن عنصر تحكم بسيط يسمح بإدخال الأرقام والتحقق من صحة النطاق.

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

المحلول

انظر إلى عنصر التحكم "NumericUpDown".يحتوي على التحقق من صحة النطاق، وسيكون الإدخال رقميًا دائمًا، ويحتوي على أزرار الزيادة/النقصان الأنيقة.

نصائح أخرى

اضطررت إلى تنفيذ عنصر تحكم يقبل فقط الأرقام أو الأعداد الصحيحة أو الحقيقية.أقوم ببناء التحكم كتخصص (اقرأ:مشتقة من) التحكم في TextBox، واستخدام التحكم في الإدخال والتعبير المنتظم للتحقق من الصحة.تعد إضافة التحقق من النطاق أمرًا سهلاً للغاية.

هذا هو الكود لبناء regex._ NumbericSeparation عبارة عن سلسلة مع أحرف مقبولة كقيم فاصلة عشرية (على سبيل المثال ، "." أو "أو": ":10.50 دولار 10.50 يورو

private string ComputeRegexPattern()
{
   StringBuilder builder = new StringBuilder();
   if (this._forcePositives)
   {
       builder.Append("([+]|[-])?");
   }
   builder.Append(@"[\d]*((");
   if (!this._useIntegers)
   {
       for (int i = 0; i < this._numericSeparator.Length; i++)
       {
           builder.Append("[").Append(this._numericSeparator[i]).Append("]");
           if ((this._numericSeparator.Length > 0) && (i != (this._numericSeparator.Length - 1)))
           {
               builder.Append("|");
           }
       }
   }
   builder.Append(@")[\d]*)?");
   return builder.ToString();
}

يطابق التعبير العادي أي رقم (على سبيل المثال.أي سلسلة تحتوي على أحرف رقمية) مع حرف واحد فقط كفاصل رقمي، وحرف اختياري '+' أو '-' في بداية السلسلة.بمجرد إنشاء التعبير العادي (عند إنشاء عنصر التحكم)، يمكنك التحقق مما إذا كانت القيمة صحيحة لتجاوز طريقة OnValidating.يقوم CheckValidNumber() فقط بتطبيق Regex على النص المقدم.إذا فشلت مطابقة التعبير العادي، فسيتم تنشيط موفر الأخطاء بخطأ محدد (تم تعيينه باستخدام الخاصية العامة ValidationError) ورفع حدث ValidationError.هنا يمكنك إجراء التحقق لمعرفة ما إذا كان الرقم ضمن النطاق المطلوب.

private bool CheckValidNumber()
{
   if (Regex.Match(this.Text, this.RegexPattern).Value != this.Text)
   {
       this._errorProvider.SetError(this, this.ValidationError);
       return false;
   }
   this._errorProvider.Clear();
   return true;
}

protected override void OnValidating(CancelEventArgs e)
{
   bool flag = this.CheckValidNumber();
   if (!flag)
   {
      e.Cancel = true;
      this.Text = "0";
   }
   base.OnValidating(e);
   if (!flag)
   {
      this.ValidationFail(this, EventArgs.Empty);
   }
}

كما قلت، أنا أيضًا أمنع المستخدم من إدخال البيانات في مربع النص بخلاف الأحرف الرقمية التي تتجاوز طريقة OnKeyPress:

protected override void OnKeyPress(KeyPressEventArgs e)
{
    if ((!char.IsDigit(e.KeyChar) && !char.IsControl(e.KeyChar)) && (!this._numberSymbols.Contains(e.KeyChar.ToString()) && !this._numericSeparator.Contains(e.KeyChar.ToString())))
    {
        e.Handled = true;
    }
    if (this._numberSymbols.Contains(e.KeyChar.ToString()) && !this._forcePositives)
    {
        e.Handled = true;
    }
    if (this._numericSeparator.Contains(e.KeyChar.ToString()) && this._useIntegers)
    {
        e.Handled = true;
    }
    base.OnKeyPress(e);
}

اللمسة الأنيقة:أتحقق مما إذا كان الرقم صالحًا في كل مرة يقوم فيها المستخدم بإصدار مفتاح، حتى يتمكن المستخدم من الحصول على تعليقات أثناء كتابته.(ولكن تذكر أنه يجب عليك توخي الحذر عند التعامل مع حدث ValidationFail؛))

protected override void OnKeyUp(KeyEventArgs e)
{
    this.CheckValidNumber();
    base.OnKeyUp(e);
}

يمكنك استخدام مربع نص عادي وعنصر تحكم Validator للتحكم في الإدخال.

حاول استخدام عنصر تحكم موفر الأخطاء للتحقق من صحة مربع النص.يمكنك استخدام int.TryParse() أو double.TryParse() للتحقق مما إذا كان رقميًا ثم التحقق من صحة النطاق.

يمكنك استخدام مجموعة من RequiredFieldValidator وComparValidator (اضبط على DataTypeCheck للمشغل واضبط النوع على Integer)

سيؤدي ذلك إلى الحصول عليه باستخدام مربع نص عادي إذا كنت ترغب في ذلك، وإلا فإن التوصية أعلاه جيدة.

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