使用按钮计算表单位置

本文关键字:表单 位置 计算 按钮 | 更新日期: 2023-09-27 18:37:20

我正在做一个编程作业,我正在尝试使这个按钮从两个文本框中获取值,并计算表单窗口的新位置。我在将文本框值转换为 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 的可接受值必须是正数。我会使用如果...else 语句来控制可接受的值?

使用按钮计算表单位置

user29...我不知道为什么死亡...回答说。这对我来说毫无意义。但是你的问题对我来说是有道理的。我想死亡...不明白你的问题。

首先,您要求的所有内容都不需要TextChanged方法中的任何内容。在 btnCompute_Click() 方法中执行所有处理,因为您想在单击按钮时执行某些操作,而不是在用户编辑文本框文本时,根据您的问题。

每当这些文本框的文本值更改时,TextChanged() 方法中的代码就会被执行。 这不是你要求它做的。但是,例如,如果您希望标签变得可见或隐藏,并设置显示文本的标签的文本,则可以使用这些事件,以便可以将其用作错误消息标签,例如,如果文本框的整数值为负数,或者即使无法解析。

因此,在 btnCompute_Click() 方法中,您首先要获取 int 值。如果文本不是整数,则需要准确确定希望代码执行的操作。在我看来,大多数初学者都会编写消息框之类的代码。我喜欢通过标签或状态栏消息向用户提供反馈,具体取决于我认为合适的内容。由于我的第一个选择是在文本框无法解析为整数时使用 Label 来显示"错误"消息,因此当值不是我想要的值时,我将简单地从按钮单击方法返回而不执行任何操作。这样,用户就可以获得他们的消息,而不会产生烦人的弹出消息框或任何东西。但是,是否要弹出消息框取决于您。其他人给了你很好的代码来做到这一点。我想给你很好的代码,避免我认为烦人的弹出框。

当将字符串转换为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属性。

根据扩展的条件,您可以有条件地检查负数或使用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");
}

我想你正在寻找这个。

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));
}

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