首页 > 解决方案 > 如何在文本框中只允许数字数据

问题描述

我是一名新的 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()

我在代码中没有看到什么?

标签: c#

解决方案


你的方法有很多问题。

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

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

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

如果正在显示消息,则文本框不是空白的(因为它是!= "")。if结合第一点,对于您编写的大多数陈述,您对真/假的期望似乎是相反的

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

  2. 即使您向用户显示消息,您仍然没有停止执行该方法的其余部分。消息对于 UX 目的来说很好,但你不应该盲目地依赖用户在得知它们时遵循规则。当验证失败时,停止计算(例如使用return语句);

  3. 这没有任何意义:

memberLevelLabel.Text = memberLevelLabel.ToString();

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

  1. 你正在做作业:

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

我们不允许使用 keypress 方法来执行此操作。

如果您在完成分配的任务时遇到困难,请与您的老师交谈。您的代码中对逻辑评估存在很深的误解,并且没有任何 StackOverflow 答案能够深入研究这一切。


推荐阅读