如何仅在文本框中允许数字数据

时间:2019-11-04 05:37:33

标签: c#

我是一名C#的新学生,我一直在从事我的项目,但是,我似乎无法让我的某些文本框正常工作。我需要确保某些文本框仅接收数字数据。当前,当我在文本框中填写与他们应该做的相反的数值时,我的药物,手术,实验室和康复文本框会返回其messageBox消息。

private void calculateButton_Click(object sender, EventArgs e)
        {
            int days;
            double medication;
            double surgery = 0;
            double labs = 0;
            double rehab = 0;

            if (int.TryParse(numDaysInHosp.Text, out days))
                if (days < 0)
                {
                    MessageBox.Show("Days In Hospital must be greater than zero.");
                }

            if (double.TryParse(medsCharges.Text, out medication))
                if (medsCharges.Text != "")
                {
                    MessageBox.Show("Charges for Medication cannot be blank.");
                    medsCharges.Focus();
                }

            if (double.TryParse(surgCharges.Text, out surgery))
               if (surgCharges.Text != "")
               {
                  MessageBox.Show("Surgical Charges cannot be blank.");
                  surgCharges.Focus();
               }

            if (double.TryParse(labFees.Text, out labs))
               if (labFees.Text != "")
               {
                    MessageBox.Show("Lab Fees cannot be blank.");
                    labFees.Focus();
               }

            if (double.TryParse(rehabCharges.Text, out rehab))
               if (rehabCharges.Text != "")
               {
                    MessageBox.Show("Rehabilitation Charges cannot be blank.");
                    rehabCharges.Focus();
               }

            { 
                double dayChrgs = CalcDayChrgs(days);
                double miscChrgs = CalcMiscChrgs(medication, surgery, labs, rehab);
                double totlCost = CalcTotlChrgs(dayChrgs, miscChrgs);

                stayChrgsLabel.Text = dayChrgs.ToString("c");
                miscChrgsLabel.Text = miscChrgs.ToString("c");
                totlCostLabel.Text = totlCost.ToString("c");
                memberLevelLabel.Text = memberLevelLabel.ToString();

            }
        }

我们不允许使用keypress方法来执行此操作。此外,我也尝试过使用以下几行,但结果都是负面的。

(string.IsNullOrEmpty(TextBox.Text))
if(TextBox.Text == "") 
if(TextBox.Text.Length == 0)
String.IsNullOrWhitespace()

我在代码中看不到什么?

4 个答案:

答案 0 :(得分:1)

这里的方法有很多问题。

  1. 您写的每张支票只能显示一条消息,如果可以将内容解析为预期的类型。如果无法解析,则永远不会输入if块,因此将不会显示任何消息。这与您想要的相反,您希望在可解析为预期类型时显示该消息。

  2. 检查空白也没有意义。

if (medsCharges.Text != "")
{
    MessageBox.Show("Charges for Medication cannot be blank.");
}

如果显示该消息,则文本框不是空白(因为它是!= "")。结合第一点,似乎您编写的大多数if语句对真/假的期望都被颠倒了

  1. 因为您要嵌套if语句,所以只有两者检查均成功时,您才会显示错误消息。但是通常,如果任何一个验证失败都将显示错误。将错误检查与或(||)结合使用,以确保 any 验证失败会导致采取适当的措施。

  2. 即使向用户显示消息,也不会阻止该方法的其余部分执行。消息对于UX而言是不错的选择,但是当您收到通知时,您不应盲目地依赖用户遵循规则。验证失败后,停止计算(例如,使用return语句);

  3. 这没有意义:

memberLevelLabel.Text = memberLevelLabel.ToString();

您正在将标签本身转换为字符串,然后将相同标签的Text值设置为该字符串。为了什么目的?

  1. 您正在做作业:
  

我是一名C#的新学生,我一直在从事我的项目

     

我们不允许使用keypress方法进行操作。

如果您在完成分配的任务时遇到麻烦,请与您的老师交谈。您的代码中对逻辑评估存在深层次的误解,并且没有StackOverflow答案可以深入探讨所有问题。

答案 1 :(得分:0)

您可以使用TextChanged事件来验证输入:

private void textBox1_TextChanged(object sender, EventArgs e)
{
  int pos = textBox1.SelectionStart;
  string result = "";
  foreach ( char c in textBox1.Text )
    if ( char.IsDigit(c) )
      result += c;
  textBox1.Text = result;
  textBox1.SelectionStart = pos;
}

接下来,我们保存carret的位置,然后分析字符串的字符以删除非数字,然后更新Text属性。

您可以添加符号和小数点分隔符的条件:

  string separatorDecimal = System.Threading.Thread.CurrentThread
                            .CurrentCulture.NumberFormat.NumberDecimalSeparator;
  bool hasDecimalSeparator = false;
  int posCarret = textBox1.SelectionStart;
  string result = "";
  for ( int index = 0; index < textBox1.Text.Length; index++ )
  {
    char c = textBox1.Text[index];
    if ( new string(c, 1) == separatorDecimal )
    {
      if ( hasDecimalSeparator )
        continue;
      else
      {
        hasDecimalSeparator = true;
        result += c;
      }
    }
    else
    if ( c == '+' || c == '-' )
    {
      if ( index == 0 )
        result += c;
    }
    else
    if ( char.IsDigit(c) )
      result += c;
  }
  textBox1.Text = result;
  textBox1.SelectionStart = posCarret;

如果您不能使用TextChanged,只需使用Click的{​​{1}}事件即可。

如果可以的话,应该使用Button控件而不是NumericUpDown

因此,您将拥有更好的UX和简单的UI验证行为。

您可以定义TextBoxMinimum值。

例如,您可以使用以下命令获取输入的Maximum:{p}:

Value

您可以在decimal之后的表单构造函数中使用此箭头隐藏右箭头:

int value = (int)numericUpDown1.Value;

通过将InitializeComponent()属性设置为numericUpDown1.Controls[0].Hide(); 并将ReadOnly设置为true或任何颜色,可以禁止文本编辑以仅允许箭头显示。

除非要禁用该控件,否则不要同时将readonly设置为true并将可见设置为false。

答案 2 :(得分:-1)

嗨,请检查以下代码是否适合您的情况

        private void calculateButton_Click(object sender, EventArgs e)
    {
        int days;
        double medication;
        double surgery = 0;
        double labs = 0;
        double rehab = 0;

        if (!int.TryParse(numDaysInHosp.Text, out days) || days == 0)
        {
            MessageBox.Show("Days In Hospital must be greater than zero.");
            numDaysInHosp.Focus();
        }
        else if (!double.TryParse(medsCharges.Text, out medication))
        {
            MessageBox.Show("Charges for Medication cannot be blank.");
            medsCharges.Focus();
        }
        else if (!double.TryParse(surgCharges.Text, out surgery))
        {
            MessageBox.Show("Surgical Charges cannot be blank.");
            surgCharges.Focus();
        }
        else if (!double.TryParse(labFees.Text, out labs))
        {
            MessageBox.Show("Lab Fees cannot be blank.");
            labFees.Focus();
        }
        else if (!double.TryParse(rehabCharges.Text, out rehab))
        {
            MessageBox.Show("Rehabilitation Charges cannot be blank.");
            rehabCharges.Focus();
        }
        else
        {
            MessageBox.Show("Everything is ok");
            //double dayChrgs = CalcDayChrgs(days);
            //double miscChrgs = CalcMiscChrgs(medication, surgery, labs, rehab);
            //double totlCost = CalcTotlChrgs(dayChrgs, miscChrgs);

            //stayChrgsLabel.Text = dayChrgs.ToString("c");
            //miscChrgsLabel.Text = miscChrgs.ToString("c");
            //totlCostLabel.Text = totlCost.ToString("c");
            //memberLevelLabel.Text = memberLevelLabel.ToString();
        }
    }

答案 3 :(得分:-1)

您要更改的单击文本框>事件>双击按键事件并在下面编写代码。如果您尝试写数字以外的其他字符,则不会写。

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

编辑:对不起,您不允许使用按键。我将更新答案。

尝试使用带有数字的 maskedtextbox 表单控件仅获取数字。

不好,但是请使用以下代码:

    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);
            }
    }