C# - 启用/禁用基于TextBox值的MenuStrip项目
问题描述:
我试图在文本框显示“正在计算...”时禁用某些菜单条项目。一旦该值消失,我希望重新启用菜单项。其目的不是要中断MD5/CRC32计算。到目前为止,我已经尝试了各种代码方法,至今还没有运气。 下面列出的应该是工作,但由于某种原因,它不。任何帮助,将不胜感激。C# - 启用/禁用基于TextBox值的MenuStrip项目
// 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"
时,您要做的不应该是禁用菜单,而应该在执行计算时禁用菜单。从用户/用户界面的角度来看,这些都是一样的,但是程序的内部工作知道得更好。
根据您引擎收录代码,试试这个:
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;
}
另外,还要注意你是如何能够将!calculating
放在if语句中而不是calculating == false
。这是因为该值已经是true
或false
,所以您不必将其与任何事物进行比较就可以知道。同样的事情适用于您的原始代码,但您不再需要这种方法。
我想我正在计算MD5的方式使得难以实现您建议的代码。我尝试了几种不同的方式,但无法让它为我工作。为了澄清,这里有一个指向与MD5计算相关的所有代码的链接。 https://pastebin.com/hBqettbc –
@LordFoxCat它有点复杂,但我更新了我的答案,所以它应该与您的代码一起工作。让我知道这是否有帮助。 – Jaquez
这为我做了诡计。谢谢您的帮助! –