Skip to content

Instantly share code, notes, and snippets.

@Vitokhv
Created March 7, 2019 03:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Vitokhv/f678fab057d51740035134bd01fbb84a to your computer and use it in GitHub Desktop.
Save Vitokhv/f678fab057d51740035134bd01fbb84a to your computer and use it in GitHub Desktop.
Форма добавления и удаления значений в listBox
using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using Microsoft.Win32;
namespace AppName
{
public partial class FormGuid : Form
{
public FormGuid()
{
InitializeComponent();
}
// Путь к файлу конфигурации (может использоваться за пределами методов)
IniFile ini = new IniFile(Environment.ExpandEnvironmentVariables("%ProgramFiles%\\AppFolder\\config.ini"));
private void FormGuid_Load(object sender, EventArgs e)
{
// Выбор нескольких элементов в listBox (SHIFT или CTRL)
listBoxPatch.SelectionMode = SelectionMode.MultiExtended;
// Загрузка всех ключей в listBox (если в файле конфигурации есть ключи)
if (ini.ReadKeys("GUID") != null)
{
string[] values = ini.ReadKeys("GUID");
foreach (var key in values)
listBoxPatch.Items.Add(key);
}
else
{
//MessageBox.Show("Не удалось загрузить все ключи в список");
}
}
// Шаблон записи в реестр с проверкой повторяющихся элементов
private void WriteRegKey(string keyName, string value)
{
try
{
// Проверка на добавление повторяющихся элементов в ListBox
//if (!listBoxPatch.Items.ToString().ToLower().Contains(value.ToLower()))
if (!listBoxPatch.Items.Cast<object>().Any(x => x.ToString().ToLower() == value.ToLower()))
{
// Переменные для подключения к разделу реестра
var guidText = (Guid.NewGuid().ToString("B")); // Генерирование GUID значения для guidText
RegistryKey lm = Registry.LocalMachine;
RegistryKey cs1 = lm.CreateSubKey("SOFTWARE\\001");
RegistryKey cs2 = cs1.CreateSubKey(guidText);
cs2.SetValue("Description", "FixSecurity"); // Запись ключа и его значения в реестр
cs2.SetValue(keyName, value, RegistryValueKind.ExpandString); // Запись ключа и его значения в реестр
cs2.SetValue("SaferFlags", "0", RegistryValueKind.DWord); // Запись ключа и его значения в реестр
// Сохранение ключа и его значения в config.ini (value имя ключа / guidText имя раздела)
ini.Write(value, guidText, "GUID");
// Добавление имени элемента из textBox в listBox
listBoxPatch.Items.Add(value);
textBoxPatch.Focus();
textBoxPatch.Clear();
}
else
{
listBoxPatch.SelectedItems.Clear(); // Очистка выделенных элементов
for (int i = listBoxPatch.Items.Count - 1; i >= 0; i--)
{
//if (listBoxPatch.Items[i].ToString().ToLower().Contains(textBoxPatch.Text.ToLower()))
//if (listBoxPatch.Items[i].ToString().ToLower() == textBoxPatch.Text.ToLower())
if (listBoxPatch.Items[i].ToString().ToLower().Equals(value.ToLower()))
{
listBoxPatch.SetSelected(i, true); // Выделение найденного элемента в списке
}
}
//listBoxPatch.Items.Remove(textBoxPatch.Text);
//textBoxPatch.Text = "";
textBoxPatch.Focus();
textBoxPatch.Clear();
MessageBox.Show("Значение уже есть в списке");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
// Шаблон чтения реестра
private string ReadKey(string key)
{
string kq = "";
try
{
RegistryKey lm = Registry.LocalMachine;
RegistryKey cs = lm.CreateSubKey("SOFTWARE\\001");
kq = (string)cs.GetValue(key);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return kq;
}
// Шаблон удаления раздела реестра
private void RemoveSubName(string subName)
{
try
{
RegistryKey lm = Registry.LocalMachine;
RegistryKey os = lm.OpenSubKey("SOFTWARE\\001", true);
os.DeleteSubKey(subName, false);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
// Добавление записи из textBoxPatch
private void buttonSave_Click(object sender, EventArgs e)
{
if (textBoxPatch.Text != "")
{
WriteRegKey("ItemData", textBoxPatch.Text);
}
else
{
textBoxPatch.Focus();
//MessageBox.Show("Введите путь к папке или файлу");
}
}
// Удаление выбранных записей из listBoxPatch
private void buttonRemove_Click(object sender, EventArgs e)
{
var patchesToDelete = listBoxPatch.SelectedItems.Cast<string>().ToList();
foreach (string patch in patchesToDelete)
{
var readPatch = ini.Read(patch, "GUID"); // Получение значений из файла config.ini
RemoveSubName(readPatch); // Удаление раздела в реестре по выбранному значению
ini.DeleteKey(patch, "GUID"); // Удаление выбранного значения в файле config.ini
listBoxPatch.Items.Remove(patch); // Удаление выбранных элементов в listBox
}
}
}
}
@Vitokhv
Copy link
Author

Vitokhv commented Mar 7, 2019

Код рабочий, но есть необходимость его упростить и упорядочить.
На изображении показано, если вставить значение отличающееся регистром, то в методе WriteRegKey производится проверка в нижем регистре обоих значений, в listBox и textBox (добавление отклонится и выделится элемент в списке с таким же значением).
image1
Содержимое config.ini выглядит так (p.s. необходимо поменять местами значение и ключ):

[GUID]
C:\Users\SERVER\AppData\Local={07d48269-947d-4fd5-973b-59188f4f5018}

Источники: #1 #2 #3

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment