我是一名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()
我在代码中看不到什么?
答案 0 :(得分:1)
这里的方法有很多问题。
您写的每张支票只能显示一条消息,如果可以将内容解析为预期的类型。如果无法解析,则永远不会输入if
块,因此将不会显示任何消息。这与您想要的相反,您希望在不可解析为预期类型时显示该消息。
检查空白也没有意义。
if (medsCharges.Text != "")
{
MessageBox.Show("Charges for Medication cannot be blank.");
}
如果显示该消息,则文本框不是空白(因为它是!= ""
)。结合第一点,似乎您编写的大多数if
语句对真/假的期望都被颠倒了
因为您要嵌套if
语句,所以只有两者检查均成功时,您才会显示错误消息。但是通常,如果任何一个验证失败都将显示错误。将错误检查与或(||
)结合使用,以确保 any 验证失败会导致采取适当的措施。
即使向用户显示消息,也不会阻止该方法的其余部分执行。消息对于UX而言是不错的选择,但是当您收到通知时,您不应盲目地依赖用户遵循规则。验证失败后,停止计算(例如,使用return
语句);
这没有意义:
memberLevelLabel.Text = memberLevelLabel.ToString();
您正在将标签本身转换为字符串,然后将相同标签的Text
值设置为该字符串。为了什么目的?
我是一名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验证行为。
您可以定义TextBox
和Minimum
值。
例如,您可以使用以下命令获取输入的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);
}
}