在多个事件完成后运行代码
本文关键字:运行 代码 事件 | 更新日期: 2023-09-27 18:34:35
我设置了一个事件,以便在检查列表视图中的项时触发。该事件调用一个函数,该函数更新窗体中的各种控件。除此之外,我需要根据检查的项目数量启用或禁用按钮。此功能非常昂贵。
例:
private void listView_ItemCheck(object sender, ItemCheckEventArgs e)
{
UpdateForm();
}
现在,当用户想要一次检查多个项目时,就会出现问题。这会导致应用程序在一段时间内无响应。
因此,我想在检查所有项目后UpdateForm()
一次,而不是每次检查单个项目时都打电话。
编辑:
这是UpdateForm()
的一部分:
private void UpdateForm()
{
// Puts all files in the mod list in a new list
List<string> modListFiles = new List<string>(lvFiles.Items.Count);
foreach (ListViewItem lvi in lvFiles.Items)
{
modListFiles.Add(lvi.Text);
}
// Adds found files to the file list
foreach (string file in Files)
{
lvFiles.Items.Add(new ListViewItem(file));
}
// Removes files from mod list that no longer exist
List<string> deleteQue = new List<string>(lvFiles.Items.Count);
foreach (string file in modListFiles)
{
// If a file in the list doesn't exist anymore, que it to delete
if (!Files.Contains(file))
{
deleteQue.Add(file);
}
}
// Remove queued files
foreach (string file in deleteQue)
{
foreach (ListViewItem lvi in lvFiles.Items)
{
if (lvi.Text == file)
{
lvFiles.Items.Remove(lvi);
break;
}
}
}
// Grays out mod list if a profile is installed
if (InstalledProfile == null)
{
lvFiles.BackColor = SystemColors.Window;
lvFiles.ForeColor = SystemColors.WindowText;
}
else
{
lvFiles.BackColor = SystemColors.Control;
lvFiles.ForeColor = SystemColors.ControlDark;
}
// Fills out the game path if it exists
if (Directory.Exists(GamePath))
{
txtGamePath.Text = GamePath;
}
else
{
txtGamePath.Text = "Game directory does not exist!";
}
// Makes sure that the cbxProfiles_SelectedIndexChanged doesn't run UpdateForm() again
handleProfileChanged = false;
// Adds profiles to the combobox
foreach (string profile in Profiles)
{
if (!cbxProfiles.Items.Contains(profile))
{
cbxProfiles.Items.Add(profile);
}
}
// Removes nonexistant profiles from the combobox
foreach (string profile in cbxProfiles.Items)
{
if (!Profiles.Contains(profile))
{
cbxProfiles.Items.Remove(profile);
}
}
if (InstalledProfile == null)
{
btnInstallUninstall.Text = "Install";
}
else
{
btnInstallUninstall.Text = "Uninstall";
}
if (Directory.Exists(GamePath) && lvFiles.CheckedItems.Count > 0)
{
btnInstallUninstall.Enabled = true;
}
else
{
btnInstallUninstall.Enabled = false;
}
}
我不得不简化一些事情,所以请原谅我可能犯的任何错误。
一些背景:我正在尝试制作一个程序,将文件从设置目录''mods复制到用户指定的目录GamePath
。它显示在 ''mods 中找到的所有文件,然后允许用户检查其中一些文件。单击btnInstall
会将这些文件复制到 GamePath
。在此所谓的安装之后,可以通过再次单击btnInstall
来删除复制的文件。
我所做的所有属性(Profiles
,GamePath
(都使用磁盘上的XML文件获取和设置它们的值。主列表视图称为lvFiles
,有时在注释中称为mod列表或文件列表。
通过不调用UpdateForm()
,我设法大大加快了检查文件的过程。相反,我创建了一个仅启用/禁用按钮的功能UpdateButtons()
。
这样,在表单被激活或流程退出之前,我们不会调用UpdateForm()
。
尽管当前的代码远非完美,但您的所有帮助都非常有用,非常感谢。我可能会更多地考虑更新机制,并在以后应用一些良好的线程。
谢谢大家!
如果你想看它,这是代码:
private void UpdateButtons()
{
#region btnOpenPath
if (Directory.Exists(GamePath))
{
btnOpenPath.Enabled = true;
}
else
{
btnOpenPath.Enabled = false;
}
#endregion
#region btnInstallUninstall
if (InstalledProfile == null)
{
btnInstallUninstall.Text = "Install";
}
else
{
btnInstallUninstall.Text = "Uninstall";
}
if (Directory.Exists(GamePath) && lvFiles.CheckedItems.Count > 0)
{
btnInstallUninstall.Enabled = true;
}
else
{
btnInstallUninstall.Enabled = false;
}
#endregion
#region btnDelete, btnCheckAll, btnUncheckAll
if (InstalledProfile == null)
{
btnDelete.Enabled = true;
btnCheckAll.Enabled = true;
btnUncheckAll.Enabled = true;
}
else
{
btnDelete.Enabled = false;
btnCheckAll.Enabled = false;
btnUncheckAll.Enabled = false;
}
#endregion
}