Как получить несколько раз выбранный другой элемент ListView C#

#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. сначала подтвердите, затем сохраните данные в списке