NEWS

[C#] Lưu trạng thái các control trên Winform vào Registry Windows

[C#] Lưu trạng thái các control trên Winform vào Registry Windows
Đăng bởi: Thảo Meo - Lượt xem: 5872 12:48:58, 02/02/2021C#   In bài viết

Xin chào các bạn, bài viết hôm nay mình sẽ tiếp tục hướng dẫn các bạn cách lưu các trạng thải thuộc tính của các Control Winform vào Windows Registry C#.

[C#] Save Setting to Registry 

Khi các bạn mở ứng dụng lên, muốn lưu lại các thuộc tính như trạng thái, kích thước, text, value của các control vào Registry.

Giống như các bạn chơi game, thì thường có chức năng save trạng thái lại.

Bình thường mình có rất nhiều các để lưu vào cơ sở dữ liệu database, text file...

Trong bài này mình sẽ hướng dẫn các bạn lưu và đọc các thông số trạng thái này vào Windows Registry.

save_setting_registry_csharp

Ở hình ảnh trên là các thuộc tính mình lưu vào Registry.

Giao diện demo ứng dụng C#:

save_registry_csharp

Khi mình nhập và các các thông tin xong thì ở sự kiện Form_Closing chúng ta sẽ lưu chúng lại vào registry.

Và khi mở form load thì chúng ta sẽ đọc các thuộc tính đó lại vào các control của mình.

Đầu tiên, các bạn tạo cho mình một class RegistryHelper.cs với nội dung như sau:

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SaveSettingRegistry
{
    class RegistryHelper
    {
        // Remove all settings for this app.
        public static void ClearSettings(string app_name)
        {
            RegistryKey reg_key =
                Registry.CurrentUser.OpenSubKey("Software", true);
            reg_key.DeleteSubKeyTree(app_name);
        }

        // Save a value.
        public static void SaveSetting(string app_name,
            string name, object value)
        {
            RegistryKey reg_key =
                Registry.CurrentUser.OpenSubKey("Software", true);
            RegistryKey sub_key = reg_key.CreateSubKey(app_name);
            sub_key.SetValue(name, value);
        }

        // Get a value.
        public static object GetSetting(string app_name, string name, object default_value)
        {
            RegistryKey reg_key = Registry.CurrentUser.OpenSubKey("Software", true);
            RegistryKey sub_key = reg_key.CreateSubKey(app_name);
            return sub_key.GetValue(name, default_value);
        }

        // Load all of the saved settings.
        public static void LoadAllSettings(string app_name, Form frm)
        {
            // Load form settings.
            frm.SetBounds(
                (int)GetSetting(app_name, "FormLeft", frm.Left),
                (int)GetSetting(app_name, "FormTop", frm.Top),
                (int)GetSetting(app_name, "FormWidth", frm.Width),
                (int)GetSetting(app_name, "FormHeight", frm.Height));
            frm.WindowState = (FormWindowState)GetSetting(app_name,
                "FormWindowState", frm.WindowState);

            // Load the controls' values.
            LoadChildSettings(app_name, frm);
        }

        // Load all child control settings.
        public static void LoadChildSettings(string app_name, Control parent)
        {
            foreach (Control child in parent.Controls)
            {
                // Restore the child's value.
                switch (child.GetType().Name)
                {
                    case "TextBox":
                    case "ListBox":
                    case "ComboBox":
                        child.Text = GetSetting(app_name, child.Name, child.Text).ToString();
                        break;
                    case "CheckBox":
                        CheckBox chk = child as CheckBox;
                        chk.Checked = bool.Parse(GetSetting(app_name,
                            child.Name, chk.Checked.ToString()).ToString());
                        break;
                    case "RadioButton":
                        RadioButton rad = child as RadioButton;
                        rad.Checked = bool.Parse(GetSetting(app_name,
                            child.Name, rad.Checked.ToString()).ToString());
                        break;
                    case "VScrollBar":
                        VScrollBar vscr = child as VScrollBar;
                        vscr.Value = (int)GetSetting(app_name, child.Name, vscr.Value);
                        break;
                    case "HScrollBar":
                        HScrollBar hscr = child as HScrollBar;
                        hscr.Value = (int)GetSetting(app_name, child.Name, hscr.Value);
                        break;
                    case "NumericUpDown":
                        NumericUpDown nud = child as NumericUpDown;
                        nud.Value = decimal.Parse(GetSetting(app_name, child.Name, nud.Value).ToString());
                        break;
                    case "CheckedListBox":
                        CheckedListBox lst = child as CheckedListBox;
                        for (int i = 0; i < lst.Items.Count; i++)
                        {
                            // Default is false.
                            string item_name = child.Name + "(" + i.ToString() + ")";
                            bool is_checked = bool.Parse(GetSetting(app_name, item_name, "False").ToString());
                            lst.SetItemChecked(i, is_checked);
                        }
                        break;

                        // Add other control types here.
                }

                // Recursively restore the child's children.
                LoadChildSettings(app_name, child);
            }
        }

        // Save all of the form's settings.
        public static void SaveAllSettings(string app_name, Form frm)
        {
            ClearSettings(app_name);

            // Save form settings.
            SaveSetting(app_name, "FormWindowState", (int)frm.WindowState);
            if (frm.WindowState == FormWindowState.Normal)
            {
                // Save current bounds.
                SaveSetting(app_name, "FormLeft", frm.Left);
                SaveSetting(app_name, "FormTop", frm.Top);
                SaveSetting(app_name, "FormWidth", frm.Width);
                SaveSetting(app_name, "FormHeight", frm.Height);
            }
            else
            {
                // Save bounds when we're restored.
                SaveSetting(app_name, "FormLeft", frm.RestoreBounds.Left);
                SaveSetting(app_name, "FormTop", frm.RestoreBounds.Top);
                SaveSetting(app_name, "FormWidth",
                    frm.RestoreBounds.Width);
                SaveSetting(app_name, "FormHeight",
                    frm.RestoreBounds.Height);
            }

            // Save the controls' values.
            SaveChildSettings(app_name, frm);
        }

        // Save all child control settings.
        public static void SaveChildSettings(string app_name,
            Control parent)
        {
            foreach (Control child in parent.Controls)
            {
                // Save the child's value.
                switch (child.GetType().Name)
                {
                    case "TextBox":
                    case "ListBox":
                    case "ComboBox":
                        SaveSetting(app_name, child.Name, child.Text);
                        break;
                    case "CheckBox":
                        CheckBox chk = child as CheckBox;
                        SaveSetting(app_name, child.Name,
                            chk.Checked.ToString());
                        break;
                    case "RadioButton":
                        RadioButton rad = child as RadioButton;
                        SaveSetting(app_name, child.Name,
                            rad.Checked.ToString());
                        break;
                    case "VScrollBar":
                        VScrollBar vscr = child as VScrollBar;
                        SaveSetting(app_name, child.Name, vscr.Value);
                        break;
                    case "HScrollBar":
                        HScrollBar hscr = child as HScrollBar;
                        SaveSetting(app_name, child.Name, hscr.Value);
                        break;
                    case "NumericUpDown":
                        NumericUpDown nud = child as NumericUpDown;
                        SaveSetting(app_name, child.Name, nud.Value);
                        break;
                    case "CheckedListBox":
                        CheckedListBox lst = child as CheckedListBox;
                        for (int i = 0; i < lst.Items.Count; i++)
                        {
                            // Default is false.
                            if (lst.GetItemChecked(i))
                            {
                                string item_name = child.Name + "(" + i.ToString() + ")";
                                SaveSetting(app_name, item_name, "True");
                            }
                        }
                        break;
                        // Add other control types here.
                }

                // Recursively save the child's children.
                SaveChildSettings(app_name, child);
            }
        }
    }
}

Và trên Form1.cs, chúng ta gọi vào hai sự kiện event Form_Load và Form_Closing để sử dụng:

namespace SaveSettingRegistry
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.FormClosing += Form1_FormClosing;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            RegistryHelper.SaveAllSettings(Application.ProductName, this);
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            RegistryHelper.LoadAllSettings(Application.ProductName, this);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            RegistryHelper.ClearSettings(Application.ProductName);
        }
    }
}

Thanks for watching!

DOWNLOAD SOURCE

 

THÔNG TIN TÁC GIẢ

BÀI VIẾT LIÊN QUAN

[C#] Lưu trạng thái các control trên Winform vào Registry Windows
Đăng bởi: Thảo Meo - Lượt xem: 5872 12:48:58, 02/02/2021C#   In bài viết

CÁC BÀI CÙNG CHỦ ĐỀ

Đọc tiếp
.