14

我试图在每次单击时更改按钮的文本。

按钮以“ON”开始。当我第一次单击它时,它应该变为“OFF”,当我再次单击它时,它应该变回 On。

我了解如何在单击时将其更改为“OFF”,但我不确定如何检查二次单击,以便将文本更改回“ON”。

到目前为止,这是我的代码:

private void OrdersButton_Click(object sender, EventArgs e)
{
       OrdersButton.Text = " Turn Orders Off";
}
4

5 回答 5

18

尝试

    private void OrdersButton_Click(object sender, EventArgs e)
    {
        if (OrdersButton.Text == "Turn Orders On")
        {
            OrdersButton.Text = "Turn Orders Off";
        }
        else if (OrdersButton.Text == "Turn Orders Off")
        {
            OrdersButton.Text = "Turn Orders On";
        }
    }

希望这可以帮助。

于 2013-03-14T03:07:55.237 回答
13

我可以看到几个可能的问题,并且可以提供更面向对象的解决方案:添加一个跟踪当前“状态”的属性:

    private bool _IsOn;

    public bool IsOn
    {
        get
        {
            return _IsOn;
        }
        set
        {
            _IsOn = value;
            OrdersButton.Text = _IsOn ? "On" : "Off";
        }
    }

并使用事件处理程序来简单地切换属性:

private void OrdersButton_Click(object sender, EventArgs e)
{
     IsOn = !IsOn;
}

这样以后更容易访问信息,并且您可以轻松地用您喜欢的任何内容替换开/关 - 如果需要,甚至可以对其进行全球化/本地化。我认为让代码依赖于显示器上的文本是一种非常糟糕的编程习惯......

编辑:另外,使用复选框或切换按钮不会更有意义吗?除了视觉表现不同之外,它可以满足您开箱即用的需求......

于 2013-03-14T03:16:27.347 回答
3

只需测试当前文本:

OrdersButton.Text = OrdersButton.Text.EndsWith("Off") ? "Turn Orders On" : "Turn Orders Off";

编辑:正如 Cody 在下面的评论中指出的那样,这不适用于本地化。对于可以更容易本地化的内容,请使用 ViewState(假设初始文本是打开订单):

bool ordersWereOn = (ViewState["OrdersAreOn"] as bool?) ?? false;
ViewState["OrdersAreOn"] = !ordersWereOn;
OrdersButton.Text = ordersWereOn ? "Turn Orders On" : "Turn Orders Off";
于 2013-03-14T03:05:56.283 回答
1

有很多方法可以做到这一点。
至于我,我可能会使用Tag属性,Control因为:

  1. 它被存储到按钮的变量中。您不需要任何外部变量
  2. 所有代码都可以用一个方法编写
  3. 您可以随时从其他方法\控件访问它

这是示例代码:

private void OrdersButton_Click(object sender, EventArgs e)
{
    bool value = (OrdersButton.Tag as bool?) ?? true;
    OrdersButton.Tag = !value;

    OrdersButton.Text = "Turn Orders " + (value ? "On" : "Off");
}

您还可以设置默认Tag值(真或假)并删除对空值的检查。您还可以通过以下方式访问它:

public void DoSomeImportantThings()
{
    var areOrdersTurnedOn = (bool)OrdersButton.Tag;
}

这不是最好的方法——它只是另一种方法。
例如,Roman Gruber可能已经展示了使用封装在 setter 中的文本更改逻辑的属性的最佳答案。

于 2015-08-10T11:57:26.410 回答
0
private void button4_Click(object sender, EventArgs e)
{
    if (button4.Text == "Show Password")
    {
        textBox2.PasswordChar = '\0';
        button4.Text = "Hide Password";
    }
    else
    {
        textBox2.PasswordChar = '*';
        button4.Text = "Show Password";
    }
}
于 2016-10-25T10:11:51.167 回答