多个事件完成后运行代码

时间:2014-12-18 17:44:51

标签: c# winforms

我设置了一个事件,以便在检查ListView中的项目时触发。该事件调用一个函数来更新表单中的各种控件。除此之外,我需要根据检查的项目启用或禁用按钮。这个功能很贵。

示例:

private void listView_ItemCheck(object sender, ItemCheckEventArgs e)
{
    UpdateForm();
}

现在,当用户想要一次检查多个项目时会出现问题。这会导致应用程序暂时无响应。

所以,我希望在检查完所有项目后再拨打UpdateForm(),而不是每次检查一个项目时都会。{/ p>

编辑:

这是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文件获取并设置其值。主ListView称为lvFiles,有时在注释中称为mod列表或文件列表。

1 个答案:

答案 0 :(得分:0)

我设法通过不调用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
    }