Используйте современный дотнет для разработки - .NET 6, создайте новый тестовый проект.
Написал короткий пример.
Обратите внимание, ваше приложение должно быть строго собрано как x64, а не Any CPU, в противном случае при обращении к реестру надо явно задавать RegistryHive.
Для начала, создам модель данных.
public class RegistryUninstallInfo
{
[DisplayName("Наименование")]
public string DisplayName { get; set; }
[DisplayName("Версия")]
public string DisplayVersion { get; set; }
[DisplayName("Разработчик")]
public string Publisher { get; set; }
[Browsable(false)]
public string UninstallString { get; set; }
}
Для нагладности дизайнер формы я не использовал, поэтому построил форму прямо в конструкторе. Просто вставьте код в проект.
using Microsoft.Win32;
using System.ComponentModel;
using System.Reflection;
using System.Text.Encodings.Web;
using System.Text.Json;
namespace WinFormsAppRegistry;
public partial class Form1 : Form
{
private BindingList<RegistryUninstallInfo> Applications { get; } = new BindingList<RegistryUninstallInfo>();
private RegistryUninstallInfo SelectedItem { get; set; }
public Form1()
{
InitializeComponent();
Text = "Пример работы с реестром для StackOverflow на русском";
MinimumSize = new Size(600, 400);
DoubleBuffered = true;
var panel = new TableLayoutPanel() { RowCount = 2 };
panel.Dock = DockStyle.Fill;
panel.RowStyles.Add(new RowStyle() { SizeType = SizeType.Percent, Height = 100 });
panel.RowStyles.Add(new RowStyle());
panel.AutoSize = true;
panel.AutoSizeMode = AutoSizeMode.GrowAndShrink;
var table = new DataGridView()
{
Dock = DockStyle.Fill,
AutoGenerateColumns = true,
AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill,
ReadOnly = true,
AllowUserToAddRows = false,
SelectionMode = DataGridViewSelectionMode.FullRowSelect
};
table.DataSource = Applications;
table.CellDoubleClick += Table_CellDoubleClick;
table.SelectionChanged += Table_SelectionChanged;
SetDoubleBuffered(table, true);
panel.Controls.Add(table, 0, 0);
var button = new Button() { Text = "Обновить" };
button.Click += UpdatedButton_Click;
panel.Controls.Add(button, 0, 1);
Controls.Add(panel);
}
public static void SetDoubleBuffered(Control c, bool value)
{
typeof(Control).GetProperty("DoubleBuffered", BindingFlags.SetProperty | BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(c, value);
}
private void Form1_Load(object sender, EventArgs e)
{
LoadRegistry();
}
private void UpdatedButton_Click(object sender, EventArgs e)
{
LoadRegistry();
}
private void Table_SelectionChanged(object sender, EventArgs e)
{
DataGridView table = (DataGridView)sender;
if (table.SelectedRows.Count > 0)
SelectedItem = table.SelectedRows[0].DataBoundItem as RegistryUninstallInfo;
}
private void Table_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
MessageBox.Show(JsonSerializer.Serialize(SelectedItem, new JsonSerializerOptions() { WriteIndented = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }));
}
private void LoadRegistry()
{
Applications.Clear();
using var section = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall");
foreach (string keyName in section.GetSubKeyNames())
{
using var key = section.OpenSubKey(keyName);
string name = key.GetValue("DisplayName")?.ToString();
if (name != null)
{
Applications.Add(new RegistryUninstallInfo
{
DisplayName = name,
DisplayVersion = key.GetValue("DisplayVersion")?.ToString(),
Publisher = key.GetValue("Publisher")?.ToString(),
UninstallString = key.GetValue("UninstallString")?.ToString(),
});
}
}
}
}
Костыль SetDoubleBuffered делает так чтобы таблица не притормаживала при отрисовке.
Выглядит это так

Если нажать на строчку двойным кликом, появится сообщение

База данных как прокси здесь не очень подходит. Но у вас наверняка есть какие-то дополнительные функции в проекте, например вижу "Белый список", вот для них и используйте БД. Полностью дублировать данные в БД, которые лежат в реестре - смысла 0, потому что при обновлении данных вам придется стирать таблицу в БД полностью и записывать туда все заново, так с базами данных не делают.
Чуть подробнее я рассматривал привязки данных здесь
sql-server? – aepot May 22 '22 at 10:44HKCU\Software\MyAppNameи там храните что нужно. Базы данных обычно делают для работы с общей базой сразу из нескольких приложений на разных машинах по сети. Вы же специализируетесь на работе с реестром, почему бы его не использовать тогда на всю катушку? – aepot May 22 '22 at 10:52