#c# #registry
#c# #реестр
Вопрос:
Мне нужно создать приложение на WinForm C # в качестве моего окончательного проекта программирования. Проект предназначен для более удобного управления реестром, чтобы пользователю было проще редактировать значения.
Поэтому мне нужен был путь к реестру из ListView, чтобы проверить, существует ли значение UninstallString. Как вы можете видеть, текущая опция удаления метки: обновления в соответствии с выбранным элементом (здесь это Adobe Creative Cloud). Проблема в том, что когда я снова нажимаю, чтобы выбрать другую программу, она выходит из строя:
private void listInstalled_SelectedIndexChanged(object sender, EventArgs e)
{
uninstall_optn.Enabled = listInstalled.Items.Count > 0;
string retrieveAppPath = listInstalled.SelectedItems[0].SubItems[2].Text; //Error happens here: System.ArgumentOutOfRangeException: 'InvalidArgument=Value of '0' is not valid for 'index'. Parameter name: index'
retrieveAppPath = retrieveAppPath.Remove(0, 19);
RegistryKey selectedAppPath = Registry.LocalMachine.OpenSubKey(retrieveAppPath, true);
if (ValueExists(selectedAppPath, "UninstallString"))
{
uninstall_crnt.Text = "Current uninstall option is: Enabled";
}
else
{
uninstall_crnt.Text = "Current uninstall option is: Disabled";
}
}
(Я прокомментировал строку, в которой возникает ошибка, и ошибку).
Комментарии:
1.
listInstalled.SelectedItems[0]
потому что вы находитесь в процессеSelectedIndexChanged
события.. угадайте, кто победит иlistInstalled.SelectedItems
будетnull
и или пустым. Если нет,SubItems
возможно, у него нет индекса2
.2. Хорошо, это немного непонятно для меня. Что мне нужно изменить и по какой причине это не работает? (Извините за то, что так сложно, я просто немного новичок в этом)
3. Событие изменения выбранного индекса очистит
SelectedItems
и, следовательно, причину ошибки.4. О, хорошо. Спасибо за разъяснение! Как я могу это исправить? Могу ли я как-то сбросить его?
Ответ №1:
с помощью этой строки вы пытаетесь получить доступ только к одному элементу
string retrieveAppPath = listInstalled.SelectedItems[0].SubItems[2].Text;
если вы хотите получить список всех выбранных элементов, попробуйте это
private bool _isUninstalEnabled;
private List<string> _myUninstallList; //list contains all selected item path in your case
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
_myUninstallList = new List<string>();
_isUninstalEnabled = listView1.Items.Count > 0;
for (int i = 0; i < listView1.SelectedIndices.Count; i )
{
string selectItemValue = listView1.Items[listView1.SelectedIndices[i]].SubItems[2].Text; //Registry path in your case
_myUninstallList.Add(selectItemValue);
}
}
Комментарии:
1. Если я правильно понимаю, сначала сохраняется путь к элементам всего списка, а затем подтверждается, включен он или нет.
2. сначала подтвердите, затем сохраните данные в списке