【问题标题】:Computing Form Location with Button使用按钮计算表单位置
【发布时间】:2013-10-30 02:35:22
【问题描述】:

我正在处理一项编程任务,我试图让这个按钮从两个文本框中获取值,并计算表单窗口的新位置。我无法将文本框值转换为 int 类型,并且无法通过 btnCompute_click 方法使用。

    private void btnCompute_Click(object sender, EventArgs e)
    {
        int x = Convert.ToInt32(txtXvalue);
        int y = Convert.ToInt32(txtYvalue);
        Location = new Point(x,y);
    }

    private void xValue_TextChanged(object sender, EventArgs e)
    {
        int xValue =
            Convert.ToInt32(txtXvalue);
    }

    private void yValue_TextChanged(object sender, EventArgs e)
    {
        int y =
            Convert.ToInt32(txtYvalue);
    }

我忘了添加一些附加信息,x 和 y 的可接受值必须是正数。我会使用 if...else 语句来控制可接受的值吗?

【问题讨论】:

  • 你有什么类型的问题,你的问题很模糊。如果您遇到错误,请发布
  • 使用我下面帖子中的方法就可以了。以上应该可以工作。您收到任何错误消息吗?
  • 代码工作正常,但我忘了添加一些额外的信息。我需要确保文本框的值是正数而不是负数。

标签: c# winforms button


【解决方案1】:

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,但对我来说,“计算”意味着计算,这并不是这个按钮真正的作用。此按钮正在移动表单,所以我将其命名为这样。

我已经设置了LocationDesktopLocation,它似乎做同样的事情。我一直使用Location,我刚刚了解到DesktopLocation 也可以,但由于Location 更短,我使用它。

有人问我为什么不用if(!int.TryParse(...)) { return; } 而不是我的if(int.TryParse(...) == false) { return; }。不幸的是,我认为! 在阅读代码时是一个很容易错过的字符,所以我避免使用它,尤其是当那个小错误与代码的实际作用相反时。所以我使用 '== false' 总是为了人类的清晰。但我确实喜欢只需要一个字符的 C# 易用性。我只是觉得很遗憾,在我看来,编写对人类更好的代码要安全得多,所以我们不会误会它。这是我使用 '== false' 而不是 ! 的唯一原因。如果您愿意,请使用!。这很方便。我很遗憾没有使用它。呵呵。

哦,我设置lblErrorX.Text = null;lblErrorY.Text = null; 的原因是在我的设计视图中的表单上,我给它们一个文本值以便我可以看到它们。 :) 所以当程序运行时,我将文本设置为空白。但如果您愿意,可以使用 Visible 属性。我只是让它们始终可见,并且只设置它们的 Text 属性。

【讨论】:

  • 我看到了死亡...更新了他的答案,看来他/她现在确实理解了这个问题。 :) 好答案,死神……我会为你的工作代码投票。我鼓励你们都使用 int.TryParse() 方法。
  • 是的,抱歉,哈哈,我发布了它并且知道我已经关闭了。这就是我更新的原因。我还发布了文本更改方法,只是为了向他展示他/她应该使用的 .Text 差异。感谢您的支持。 .TryParse 还有什么作用?编辑还是新手哈哈。 Nvm 发现了它的作用,哈哈。谢谢(你的)信息。这不是更好吗? if (!int.TryParse(txtXvalue.Text, out x)) return;
  • 我更改了设计工作室中未更改的 textchanged 属性。在这些属性更改和一些更改之后,这行得通。
  • 感谢您的澄清,我忘记添加一些其他信息,我已经编辑了我的原始帖子。我将如何确保在文本框中只接受正值?
  • 死亡...,我已经更新了我的消息,以解释我对为什么使用 == false 而不是!否定运算符。不幸的是,仅仅是为了人类可读性,因为!很方便。但没有其他原因。采用 !如果你不关心一个人不小心错过了那条小虚线,我们称之为感叹号。 ;)
【解决方案2】:

根据您的扩​​展标准,您可以有条件地检查负数或使用Math.Abs 来获取绝对值。像这样的。

int x, y;

if (int.TryParse(txtXvalue.Text, out x) && int.TryParse(txtYvalue.Text, out y))
{
    if (x < 0 || y < 0)
    {
        MessageBox.Show("Negative numbers not allowed");
    }
    else
        Location = new Point(x, y);

}
else
{
    MessageBox.Show("Must be an Integer");
}

int x, y;

if (int.TryParse(txtXvalue.Text, out x) && int.TryParse(txtYvalue.Text, out y))
{
    Location = new Point(Math.Abs(x), Math.Abs(y));
}
else
{
    MessageBox.Show("Must be an Integer");
}

【讨论】:

    【解决方案3】:

    我想你正在寻找这个。

    private void btnCompute_Click(object sender, EventArgs e)
    {
        int x = Convert.ToInt32(txtXvalue.Text);
        int y = Convert.ToInt32(txtYvalue.Text);
        DesktopLocation = new Point(Math.Abs(x), Math.Abs(y));
    
    }
    

    这将获取桌面的位置。您还需要 .Text 来获取文本框中的文本。您还应该在使用前检查以确保文本不为空或为空,否则会导致错误。 如果这不是您要查找的内容,请再解释一下。

    【讨论】:

    • 如下所述,您可以删除 xValue_TextChanged 和 yValue_TextChanged 函数。
    • 您的代码也可以,我知道我的错误在哪里,我忘记了 .Text (类运算符?)。删除 textchanged 方法后,这也让我得到了我想要的东西。
    • 嗯,忘记添加一些附加信息。我需要包含什么样的语句来确保只返回正值?
    • @deathismyfriend 上面的代码也将允许负数。
    • @AccessDenied 是的,但它会将它们变成正值。
    猜你喜欢
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多