使用按钮计算表单位置

时间:2013-10-30 02:35:22

标签: c# winforms button

我正在编写一个编程作业,我正在尝试使这个按钮获取两个文本框中的值,并计算表单窗口的新位置。我无法将文本框值转换为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语句来控制可接受的值吗?

3 个答案:

答案 0 :(得分:2)

user29 ...我不知道为什么死亡......回答说。对我来说完全是无稽之谈。但你的问题对我有意义。我想死亡......不明白你的问题。

首先,你问的一切在TextChanged方法中需要什么。 在btnCompute_Click()方法中进行所有处理,因为你想在你点击按钮时做某事*,而不是在用户根据你的问题编辑文本框的文本时做。

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

因此,在btnCompute_Click()方法中,首先要获取int值。如果文本不是整数,则需要准确确定代码要执行的操作。在我看来,大多数初学者都会对消息框等内容进行编码。我想根据我认为合适的内容向用户提供标签或状态栏消息的反馈。由于我的第一选择是使用Label来显示“错误”消息,当文本框无法解析为整数时,我只需从按钮单击方法返回,而不会在值不是我想要的时候做任何事情。这样,用户可以在没有恼人的弹出消息框或任何内容的情况下获取消息。但是,你是否想要弹出一个消息框取决于你。其他人为你提供了很好的代码。我想给你很好的代码,避免我认为恼人的弹出框。

将字符串转换为int时,如果无法解析字符串,Convert.ToInt32将抛出错误。 int.TryParse是真正将字符串解析为整数而没有任何错误的灵丹妙药。这是我将使用的整个代码。我做了一个新项目,以确保我没有给你错误的代码。我告诉你我如何处理这个问题的代码。

在您更新的先决条件中,您提到x&你必须积极而不是消极。我告诉你,这些不一样。例如,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对应你的txtX值。我的btnMoveForm对应你的btnCompute,但对我来说,'compute'意味着计算,这不是这个按钮的作用。这个按钮正在移动表格,所以我就这样命名。

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

有人问为什么我不使用if(!int.TryParse(...)) { return; }而不是if(int.TryParse(...) == false) { return; }。遗憾的是,我认为!在阅读代码时很容易错过!,所以我避免使用它,特别是当这个小错误意味着与代码真正做的相反时。所以我对'== false'的使用总是为了人类的清晰。但我确实喜欢只需要一个角色的C#轻松。我认为这是一种耻辱,在我看来,编写对人类更好的代码更安全,所以我们不会误解它。这是我使用'== false'而不是!的唯一原因。如果您愿意,请使用lblErrorX.Text = null;。这很方便。我很遗憾没有使用它。和合。

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

答案 1 :(得分:1)

我认为你正在寻找这个。

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来获取文本框中的文本。您还应检查以确保文本在使用前不为空或为空,否则将导致错误。 如果这不是你想要的,请再解释一下。

答案 2 :(得分:1)

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