private bool DataValidation(string Checker)
{
int i;
if (Int32.TryParse(Checker, out i))
{
return true;
}
else
{
return false;
}
}
private void NumberChecker()
{
if (int.Parse(txtRank.Text) >= 0 || int.Parse(txtRank.Text) <= 50)
{
errorProvider1.SetError(txtRank, string.Empty);
errorProvider1.Clear();
}
else
{
errorProvider1.SetError(txtRank, "Between 1 and 50 please!");
}
}
private void txtRank_Validating(object sender, CancelEventArgs e)
{
if (DataValidation(txtRank.Text) == false)
{
errorProvider1.SetError(txtRank, "Must be numeric!");
}
else
{
errorProvider1.SetError(txtRank, string.Empty);
errorProvider1.Clear();
}
NumberChecker();
}
我一直试图让它工作大约4个小时,有人可以告诉我为什么它一直说&#34;字符串格式错误&#34;我已经在验证事件中尝试了所有这些,我所做的一切都没有。我不明白为什么。
更新
private void txtRank_Validating(object sender, CancelEventArgs e)
{
if (DataValidation(txtRank.Text) == false)
{
errorProvider1.SetError(txtRank, "Must be numeric!");
}
else
{
errorProvider1.SetError(txtRank, string.Empty);
errorProvider1.Clear();
}
if (Convert.ToInt32(txtRank.Text) >= 0 && Convert.ToInt32(txtRank.Text) <= 50)
{
errorProvider1.SetError(txtRank, string.Empty);
errorProvider1.Clear();
}
else
{
errorProvider1.SetError(txtRank, "Between 1 and 50 please!");
}
}
如果我使用上面的代码,我可以做其中一个,但我必须注释掉一段代码才能做到这一点。
答案 0 :(得分:0)
你在这里做了很多的东西,根本不需要。
首先:假设DataValidation
方法中的if语句仅用于return true
和return false
,if语句完全没必要。你可以说return Int32.TryParse(Checker, out i);
它会做同样的事情。实际上,您可以首先删除int i
,然后执行此操作:
private bool DataValidation(string Checker) {
return Int32.TryParse(Checker, out int i);
}
out int i
创建一个临时变量......由于DataValidation
方法现在是单个方法调用,您可能会意识到现在整个方法都是不必要的。您可以简单地将DataValidation(someString)
的任何调用替换为Int32.TryParse(someString, out int i)
而无副作用。
继续使用NumberChecker
方法,错误立即变得明显:
if (int.Parse(txtRank.Text) >= 0 || int.Parse(txtRank.Text) <= 50)
这是您的代码中唯一一个解析字符串而不检查以确保它首先是数字的地方。显然,txtRank.Text
是一个不正确数字的字符串。这实际上是TryParse
派上用场的地方。
我将假设你不确切地知道TryParse
做了什么以及你只是将它用作错误检查器,这没关系,因为out
参数的功能不是显而易见。
有效地,out
关键字允许函数更改传入的内容。请使用以下代码段:
public static void Main(string[] args)
{
String foo = "abc";
DoSomething(out foo);
Console.WriteLine(foo);
}
private static void DoSomething(out String something)
{
something = "def";
}
尽管DoSomething
没有返回值,但Console.WriteLine(foo);
会写def
而不是abc
。 Int32.TryParse
使用此功能:返回一个bool
,表示操作是否成功。如果 成功,它会将结果存储在用作out
参数的变量中。
因此,您的NumberChecker
方法应如下所示:
private void NumberChecker()
{
int num = null;
if (Int32.TryParse(txtRank.Text, out num) {
// if TryParse returns true, then we have a result in `num`.
if (num >= 0 && num <= 50)
{
errorProvider1.SetError(txtRank, string.Empty);
errorProvider1.Clear();
}
else // txtRank.Text is a number, but is not within the range
{
errorProvider1.SetError(txtRank, "Between 1 and 50 please!");
}
}
else // txtRank.Text is not a number to begin with
{
errorProvider1.SetError(txtRank, "txtRank.Text is not a number!");
}
}
值得注意:由于NumberChecker()
现在可以处理过去无效文本的情况,例如txtRank_Validating()
,您现在也可以删除txtRank_Validating()
。 NumberChecker()
现在是唯一必需的代码。
最后值得注意的是:在您的原始代码中,虽然您的txtRank_Validating()
if txtRank.Text
中的if语句不是数字,但它仍然失败的原因是因为NumberChecker()
在方法的末尾调用了文本是否为数字。从这个意义上说,最简单的解决方案就是移动NumberChecker();
在errorProvider1.Clear();
块内调用else
之后。但我认为这个答案中的其他细节值得注意。