C# - Enable/Disable 基于文本框值的 MenuStrip 项

C# - Enable/Disable MenuStrip Item Based On TextBox Value

我试图在显示文本框时禁用某些菜单条项目 "Calculating..."。一旦该值消失,我希望重新启用菜单项。它的目的不是中断MD5/CRC32计算。到目前为止,我已经尝试了各种代码方法,但到目前为止还没有运气。下面列出的 应该 有效,但由于某些原因它没有。任何帮助将不胜感激。

// THIS PART WORKS
if (boxMD5.Text.Contains("Calculating") == true)
        {
            openROMToolStripMenuItem.Enabled = false;
            saveROMDataToolStripMenuItem.Enabled = false;
            asTXTToolStripMenuItem.Enabled = false;
            asHTMLToolStripMenuItem.Enabled = false;
        }
// THIS PART DOES NOT WORK
else if (boxMD5.Text.Contains("Calculating") == false)
        {
            openROMToolStripMenuItem.Enabled = true;
            saveROMDataToolStripMenuItem.Enabled = true;
            asTXTToolStripMenuItem.Enabled = true;
            asHTMLToolStripMenuItem.Enabled = true;
        }

我不能完全告诉您为什么代码没有达到您的预期,但我可以提出一个建议,这将改变您的方法,同时可能有助于实现您的目标。您要做的不应该是在文本框包含 "Calculating" 时禁用菜单,而是应该在执行计算时禁用菜单。从 user/UI 的角度来看,这些是同一件事,但您的程序的内部工作原理更清楚。

根据您的 PasteBin 代码,试试这个:

private void openROMToolStripMenuItem_Click(object sender, EventArgs e)
{
    //Other code omitted for brevity

    if (File.Exists(OpenFileDialog1.FileName))
    {
        UpdateUI("Calculating...");
        backgroundWorker1.RunWorkerAsync(OpenFileDialog1.FileName);
    }

    //Other code omitted for brevity
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    UpdateUI(e.Result.ToString());
}

新方法 UpdateUI() 如下所示:

void UpdateUI(string hash)
{
    var calculating = hash == "Calculating...";

    if (!calculating)
    {
        progressBar1.Value = 0;
    }

    openROMToolStripMenuItem.Enabled = !calculating;
    saveROMDataToolStripMenuItem.Enabled = !calculating;
    asTXTToolStripMenuItem.Enabled = !calculating;
    asHTMLToolStripMenuItem.Enabled = !calculating;

    boxMD5.Text = hash;
}

此外,请注意如何在 if 语句中只放置 !calculating 而不是 calculating == false。这是因为该值已经是 truefalse,因此您无需将其与任何内容进行比较即可确定。同样的事情适用于您的原始代码,但您不再需要使用这种方法。