【问题标题】:Enable/Disable the Save button correctly正确启用/禁用保存按钮
【发布时间】:2012-07-27 13:39:49
【问题描述】:

假设我们有一个带有保存工具栏按钮的 Win32 表单,并且表单上有一些像 CheckBox 这样的子控件,现在我们为复选框的 onchange 事件编写一行代码来启用/禁用保存按钮。假设首先选中复选框,禁用保存按钮,现在取消选中复选框,启用保存按钮...现在再次选择复选框保存按钮仍处于启用状态...例如,对于文本框也是如此。假设它的文本是“Hi”...将其更改为“Hi Bye”,保存已启用...将其更改回“Hi”原样,保存仍处于启用状态... 有没有我们可以用来防止这些错误启用/禁用保存按钮的模型?

【问题讨论】:

  • 你能用段落和更容易阅读的东西重新措辞吗? :)
  • 大多数文本编辑器都不会打扰。撤消对上次保存的版本的更改已得到处理,但手动编辑回以前的版本只需要进行太多检查。
  • 嗯,我主要考虑的是“IsDirty”逻辑,它可以跟踪每个控件的状态作为一个对象,还保留这些对象的备份,比较它们,确定它是否是脏的。 .然后启用保存按钮..

标签: c#


【解决方案1】:

您需要在 Checkbox 的CheckedChanged 事件中编写一些IF - ELSE 代码。通过检查控件的Checked 属性(复选框)来检查当前状态,如果是,则将按钮的启用属性设置为 true,否则为 false。

private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
    if (checkBox2.Checked)
        button1.Enabled = true;
    else
        button1.Enabled = false;
}

假设checkBox2 是复选框的名称,button1 是保存按钮的名称。

您也可以对其他控件使用相同的 IF ELSE 逻辑。要设置文本框的值,请使用 Text 属性

 TextBox1.Text="I am gonna try something now"l

编辑:正如comecme 建议的那样,如果您只想基于复选框启用/禁用按钮,则可以在一行中完成,而不是像这样的 IF else 块

button1.Enabled=checkBox2.Checked

【讨论】:

  • 更简单的是:button1.Enabled = checkBox2.Checked;
  • @comecme:是的。但我使用 IF ELSE 让 OP 了解什么是此类问题以及应如何解决此类问题。我也会添加这个答案。
  • 我主要考虑的是“IsDirty”逻辑,它可以将每个控件的状态作为一个对象来跟踪,并保留这些对象的备份,比较它们,判断它是否是脏的。然后启用保存按钮..
【解决方案2】:

您可以存储上次保存的状态,并在当前状态发生变化时与它进行比较,以查看它们是否相同。如果是这样,请禁用该按钮。

如果这些比较代价高昂,您可以通过计算所有需要保存的字段的哈希值来提高效率,并且仅在最后保存状态的哈希与当前状态。

【讨论】:

  • 我主要考虑的是“IsDirty”逻辑,它可以将每个控件的状态作为一个对象来跟踪,并保留这些对象的备份,比较它们,判断它是否是脏的。然后启用保存按钮..
【解决方案3】:

我更喜欢将我所有的控制状态检查和设置放在一个方法中:

private void UpdateControls()
{
    saveButton.Enabled = checkBox1.Checked;
    otherButton.Visible = checkBox2.Checked && textBox.Text.Length > 0;
}

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    UpdateControls();
}

private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
    UpdateControls();
}

private void textBox_TextChanged(object sender, EventArgs e)
{
    UpdateControls();
}

这意味着您只有一个地方可以检查和设置状态,并且更容易理解正在发生的事情,尤其是当您有复杂的表单时。在分配布尔变量时,我也更喜欢布尔表达式而不是 if 语句,因为它可以同时满足 true 和 false 的要求,而无需编写单独的 else 语句(可能会被忘记)。

【讨论】:

  • 我主要考虑的是“IsDirty”逻辑,它可以将每个控件的状态作为一个对象来跟踪,并保留这些对象的备份,比较它们,判断它是否是脏的。然后启用保存按钮..
【解决方案4】:

我不知道你的复选框要去哪里,但我会使用布尔变量:

private Boolean _canSave = false;
private Boolean CanSave 
{
    get { return _canSave; }
    set
    {
        _canSave = value;
        MenuSave.Enabled = value;
    }
}

public void MenuSave_Click()
{
    Save();
}

private void Save()
{
    // do your thing

    CanSave = false;
}

public void TextBox_TextChanged()
{
    CanSave = true;
}

当您将文本恢复为原始时,这不会导致禁用保存菜单。如果需要,您必须将 Save() 方法中的文本存储在私有变量中,并将其与每个 TextBox_TextChanged() 上的当前文本进行比较,以确定与原始文本相比是否有更改(即自上次保存) 已发生。

【讨论】:

  • 是的,我主要考虑的是“IsDirty”逻辑,它可以将每个控件的状态作为一个对象来跟踪,并保留这些对象的备份,比较它们,确定它是否脏。 .然后启用保存按钮...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 2021-03-25
  • 2012-02-17
  • 1970-01-01
相关资源
最近更新 更多