Как после удаления элемента в listbox, удалить ключ в реестре? [Решено]
Цитата: Удаленный пользователь от 16.10.2021, 01:40Здравствуйте, помогите с кодом:
void conbutton_Click(object sender, EventArgs e) { string[] files = new string[50]; try { files = Registry.ClassesRoot.OpenSubKey(@"*\shell\").GetSubKeyNames(); } catch { } for (int i = 0; i < files.Length; i++) { try { contentlist.Items.Add(files[i]); } catch { } }Кнопкой "conbutton", я создаю элементы в listbox (contentlist), контекстного меню из реестра
Также, у меня есть кнопка для удаления элементов оттуда (button2)
Однако, удаляется только элемент, но нужно еще и ключ реестра снести(((void button2_Click(object sender, EventArgs e) { if (contentlist.SelectedItem != null) { RegistryKey path = Registry.ClassesRoot.OpenSubKey($@"{files}"); try { contentlist.Items.Remove(contentlist.SelectedItem); path.DeleteSubKey($@"{path}"); path.Close(); } catch { reportlabel.Text = "regedit key isn't delete"; } contentlist.Items.Remove(contentlist.SelectedItem); }Перебрал кучу вариантов, на форумах не нашел ответа. Помогите решить проблему, пожалуйста.
Здравствуйте, помогите с кодом:
void conbutton_Click(object sender, EventArgs e)
{
string[] files = new string[50];
try
{
files = Registry.ClassesRoot.OpenSubKey(@"*\shell\").GetSubKeyNames();
}
catch { }
for (int i = 0; i < files.Length; i++)
{
try
{
contentlist.Items.Add(files[i]);
}
catch { }
}
Кнопкой "conbutton", я создаю элементы в listbox (contentlist), контекстного меню из реестра
Также, у меня есть кнопка для удаления элементов оттуда (button2)
Однако, удаляется только элемент, но нужно еще и ключ реестра снести(((
void button2_Click(object sender, EventArgs e)
{
if (contentlist.SelectedItem != null)
{
RegistryKey path = Registry.ClassesRoot.OpenSubKey($@"{files}");
try
{
contentlist.Items.Remove(contentlist.SelectedItem);
path.DeleteSubKey($@"{path}");
path.Close();
}
catch { reportlabel.Text = "regedit key isn't delete"; }
contentlist.Items.Remove(contentlist.SelectedItem);
}
Перебрал кучу вариантов, на форумах не нашел ответа. Помогите решить проблему, пожалуйста.
Цитата: Удаленный пользователь от 16.10.2021, 02:51Добрый🖐.
DeleteSubKeyTree?
Добрый🖐.
DeleteSubKeyTree?
Цитата: Удаленный пользователь от 16.10.2021, 02:57Если я правильно понял DeleteSubKey заменить на DeleteSubKeyTree, не меняет ситуацию
Если я правильно понял DeleteSubKey заменить на DeleteSubKeyTree, не меняет ситуацию
Цитата: Удаленный пользователь от 16.10.2021, 03:14А так
RegistryKey path = Registry.ClassesRoot.OpenSubKey($@"{files}", true);
DeleteSubKeyTreeтак и оставить.
А так СкопированоRegistryKey path = Registry.СкопированоClassesRoot.OpenSubKey($@"{files}", true);
СкопированоDeleteSubKeyTree так и оставить.
Цитата: admin от 16.10.2021, 09:46Приветствую 🖐
В этой строке ошибка:
RegistryKey path = Registry.ClassesRoot.OpenSubKey($@"{files}");
✓ files – это массив ключей, а открываться должен 1 конкретный ключ.
Вы туда вставляете весь массив.
В коде ниже не нужны ни
forниtry catch:for (int i = 0; i < files.Length; i++) { try { contentlist.Items.Add(files[i]); } catch { } }
Предлагаю переписать событие первой кнопки
conbuttonтак:var files = new List<string>(); using (var key = Registry.ClassesRoot.OpenSubKey(@"*\shell\")) files = key.GetSubKeyNames().ToList(); files.ForEach(x => contentlist.Items.Add(x));
✓ Далее во второй кнопке
button2бессмысленно повторяетсяcontentlist.Items.Remove(contentlist.SelectedItem);
✓ Также не нужно оборачивать вtry catchто, что не упадёт. Говорил про try catch – берегите память и не злоупотребляйте.
✓ Также у Вас не закрывается открываемая ветка. Именно поэтому в уроках говорил привыкать кusing.
✓ И если мы собираемся что-то добавлять / изменять / удалять из ветки, которую открываем, не забываем дописыватьtrueвнутриOpenSubkey, иначе получим ошибку неавторизованного доступа к разделу реестра.
Код для второй кнопки
button2:var item = contentlist.SelectedItem; if (item != null) { using (RegistryKey path = Registry.ClassesRoot.OpenSubKey($@"*\shell\{item}", true)) { try { path.DeleteSubKeyTree(""); contentlist.Items.Remove(item); } catch { reportlabel.Text = "Failed to delete registry key"; } } }
Приветствую 🖐
В этой строке ошибка: СкопированоRegistryKey path = Registry.ClassesRoot.OpenSubKey($@"{files}");
✓ files – это массив ключей, а открываться должен 1 конкретный ключ.
Вы туда вставляете весь массив.
В коде ниже не нужны ни Скопированоfor ни Скопированоtry catch:
for (int i = 0; i < files.Length; i++)
{
try
{
contentlist.Items.Add(files[i]);
}
catch { }
}
Предлагаю переписать событие первой кнопки Скопированоconbutton так:
var files = new List<string>();
using (var key = Registry.ClassesRoot.OpenSubKey(@"*\shell\"))
files = key.GetSubKeyNames().ToList();
files.ForEach(x => contentlist.Items.Add(x));
✓ Далее во второй кнопке Скопированоbutton2 бессмысленно повторяется Скопированоcontentlist.Items.Remove(contentlist.SelectedItem);
✓ Также не нужно оборачивать в Скопированоtry catch то, что не упадёт. Говорил про try catch – берегите память и не злоупотребляйте.
✓ Также у Вас не закрывается открываемая ветка. Именно поэтому в уроках говорил привыкать к Скопированоusing.
✓ И если мы собираемся что-то добавлять / изменять / удалять из ветки, которую открываем, не забываем дописывать Скопированоtrue внутри СкопированоOpenSubkey, иначе получим ошибку неавторизованного доступа к разделу реестра.
Код для второй кнопки Скопированоbutton2:
var item = contentlist.SelectedItem;
if (item != null)
{
using (RegistryKey path = Registry.ClassesRoot.OpenSubKey($@"*\shell\{item}", true))
{
try
{
path.DeleteSubKeyTree("");
contentlist.Items.Remove(item);
}
catch
{
reportlabel.Text = "Failed to delete registry key";
}
}
}
Цитата: Удаленный пользователь от 16.10.2021, 12:52Христ, спасибо Вам большое! Пишу код только неделю, прыгаю выше головы, поэтому так криво, теперь работает!
Христ, спасибо Вам большое! Пишу код только неделю, прыгаю выше головы, поэтому так криво, теперь работает!
Цитата: admin от 16.10.2021, 13:07Я бы, конечно, рекомендовал посмотреть как минимум первые 20 уроков. Это просто маст-хэв.
После этого более наглядные и посложнее следующие 20 уроков. Ещё 30 уроков, которые вышли в этом году можно уже с перерывами. Но вот первые 20 + 20 просто обязательно, иначе много мучиться придётся и исправлять постоянно 😉
Я бы, конечно, рекомендовал посмотреть как минимум первые 20 уроков. Это просто маст-хэв.
После этого более наглядные и посложнее следующие 20 уроков. Ещё 30 уроков, которые вышли в этом году можно уже с перерывами. Но вот первые 20 + 20 просто обязательно, иначе много мучиться придётся и исправлять постоянно 😉