0

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

4

4 回答 4

2

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

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

AssumingcheckBox2是 Checkboxbutton1的名称,是 Save 按钮的名称。

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

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

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

button1.Enabled=checkBox2.Checked
于 2012-07-27T13:45:05.140 回答
1

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

如果这些比较很昂贵,您可以通过计算所有需要保存的字段的哈希值来提高效率,并且仅在最后保存状态的哈希与当前状态的哈希匹配时才进行适当的比较.

于 2012-07-27T13:43:42.540 回答
1

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

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 语句(可能会被忘记)。

于 2012-07-27T13:59:05.413 回答
0

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

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()方法中的文本存储在私有变量中,并将其与 every 上的当前文本进行比较,TextBox_TextChanged()以确定与原始文本相比是否发生了更改(即自上次保存以来)。

于 2012-07-27T13:45:00.163 回答