user29...我不知道为什么死亡...回答说。对我来说完全是无稽之谈。但你的问题对我来说很有意义。我想死亡......不明白你的问题。
首先,您要求的所有内容都不需要 TextChanged 方法中的任何内容。根据您的问题,在 btnCompute_Click() 方法中进行所有处理,因为您想在单击按钮时做某事,而不是在用户编辑文本框的文本时。
每当这些文本框的 Text 值发生更改时,就会执行 TextChanged() 方法中的代码。这不是你要求它做的。但是您可以使用这些事件,例如,如果您希望标签变为可见或隐藏并设置显示文本的标签的文本,那么您可以将其用作错误消息标签,例如,如果文本框是否定的,或者即使它无法解析。
因此,在您的 btnCompute_Click() 方法中,您首先要获取 int 值。如果文本不是整数,您需要准确确定您希望代码执行的操作。在我看来,大多数初学者都会编写消息框之类的代码。我喜欢用标签或状态栏消息给用户反馈,这取决于我觉得合适的。由于我的第一选择是在文本框无法解析为整数时使用标签来显示“错误”消息,因此当值不是我想要的值时,我将简单地从按钮单击方法返回而不做任何事情。这样,用户无需烦人的弹出消息框或任何东西。但是是否要弹出消息框取决于您。其他人已经给了你很好的代码来做到这一点。我想给你很好的代码来避免我认为烦人的弹出框。
将字符串转换为 时int
,如果无法解析字符串,则 Convert.ToInt32 将引发错误。int.TryParse
是真正将字符串解析为整数而没有任何错误的灵丹妙药。这是我将使用的整个代码。我做了一个新项目只是为了确保我没有给你错误的代码。我给你我如何处理这个的代码。
在您更新的先决条件中,您提到 x 和 y 必须是正数而不是负数。我注意到这些是不一样的。例如,0 既不是正数也不是负数。我假设您在技术上的意思是 x 和 y 不能为负数,(并且它不需要为正数,因为应该允许 0)。
private void Form1_Load(object sender, EventArgs e)
{
lblErrorX.Text = null;
lblErrorY.Text = null;
}
private void btnMoveForm_Click(object sender, EventArgs e)
{
int x = 0; if (int.TryParse(txtX.Text, out x) == false) { return; }
int y = 0; if (int.TryParse(txtY.Text, out y) == false) { return; }
if (x < 0 || y < 0) { return; }
this.Location = new Point(x, y);
}
private void txtX_TextChanged(object sender, EventArgs e)
{
int x = 0;
if (int.TryParse(txtX.Text, out x) == false)
{ lblErrorX.Text = "X is not an valid integer."; return; }
if (x < 0) { lblErrorX.Text = "X cannot be negative."; return; }
lblErrorX.Text = null;
}
private void txtY_TextChanged(object sender, EventArgs e)
{
int y = 0;
if (int.TryParse(txtY.Text, out y) == false)
{ lblErrorY.Text = "Y is not an valid integer."; return; }
if (y < 0) { lblErrorY.Text = "Y cannot be negative."; return; }
lblErrorY.Text = null;
}
在我的项目中,在表单上,按照从左到右的顺序:lblX、txtX、lblErrorX。我对 Y 有相同的对应关系:lblY、txtY、lblErrorY。然后我有一个Button
:btnMoveForm。所以我的 txtX 对应于你的 txtXvalue。我的 btnMoveForm 对应于你的 btnCompute,但对我来说,“计算”意味着计算,这并不是这个按钮真正的作用。这个按钮正在移动表单,所以这就是我这样命名的原因。
我玩过设置Location
和DesktopLocation
它似乎做同样的事情。我一直在使用Location
,并且我刚刚了解到 DesktopLocation 也可以使用,但是因为Location
它更短,所以我使用它。
有人问我为什么不使用if(!int.TryParse(...)) { return; }
而不是我的if(int.TryParse(...) == false) { return; }
. 不幸的是,我的原因是我认为!
在阅读代码时很容易错过一个字符,所以我避免它,特别是当那个小错误意味着与代码真正会做的相反时。所以我使用 '== false' 总是为了人类的清晰。但我确实喜欢只需要一个字符的 C# 易用性。我只是觉得很遗憾,在我看来,编写对人类更好的代码要安全得多,所以我们不会误会它。这是我使用 '== false' 而不是!
. 喜欢就用!
。这很方便。我很遗憾没有使用它。呵呵。
哦,我在设计视图中的表单上设置 and 的原因lblErrorX.Text = null;
是lblErrorY.Text = null;
,我给它们一个文本值,以便我可以看到它们。:) 所以当程序运行时,我将文本设置为空白。但如果您愿意,可以使用 Visible 属性。我只是让它们始终可见并且只设置它们的Text
属性。