我设置了一个事件,以便在检查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
删除复制的文件。
我所做的所有属性(Profiles
,GamePath
)都使用磁盘上的XML文件获取并设置其值。主ListView称为lvFiles
,有时在注释中称为mod列表或文件列表。
答案 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
}