在多个事件完成后运行代码

本文关键字:运行 代码 事件 | 更新日期: 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来删除复制的文件。

我所做的所有属性(ProfilesGamePath(都使用磁盘上的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
    }