0

我正在尝试在我的应用程序中实现一个简单的保存加载功能,它将我的应用程序中各种 GUI 元素(文本框、复选框、下拉菜单等)的状态保存到自定义命名的 .txt 文件中,然后下次用户运行我的应用程序时将它们加载回来。我不想使用 My.Settings,因为它是一个可移植的应用程序,因此设置文件必须在可执行文件旁边。还因为我的应用程序是一个编辑器,并且设置必须按名称绑定到用户正在使用的当前文件。写权限不是问题。我想以某种方式对此进行编码,以便我只需写下要在我的代码中提及一次的 GUI 元素的名称,最好是在一个列表中。像这样(伪代码):

    'list
    Dim ElementsToSave() as Object = {
    Textbox1.text,
    Checkbox1.Checked,
    DropDownMenu1.SelectedItem,
    .....
    }

    'save-load sub
    Sub SaveLoad(Elements as Object, mode as string)
       If mode = "save" then
          For each Element in Elements
             ??? 'save each element state to .txt file
          Next
       If mode = "load" then
          For each Element in Elements
             ??? 'load each element state from .txt file
          Next
       End if
   End sub

   'call
   SaveLoad(ElementsToSave, "save")
   'or
   SaveLoad(ElementsToSave, "load")

我希望这传达了我想要实现的目标。任何人都可以就如何使这项工作提供任何建议吗?

编辑:我忘了提。如果 .txt 文件中的每个值都将保存一个指向特定元素的键,那就太好了,这样如果我将来在我的应用程序中添加更多的 GUI 元素,或者重新排列它们,这个保存 - load sub 将始终从 .txt 文件中为特定元素选择正确的值。

4

1 回答 1

0
   using System.IO;
   ...

    private enum ControlProperty
    {
        None = 0,
        Text = 1,
        Checked = 2,
        SelectedValue = 3
    }

    private string GetSettingsFile()
    {
        FileInfo fi = new FileInfo(System.Reflection.Assembly.GetEntryAssembly().Location);
        string path = Path.Combine(fi.Directory.FullName, "settings.txt");
        return path;
    }

    private void test()
    {
        SaveSettings();
        LoadSettings();
    }

    private void SaveSettings()
    {
        object[] vals = new object[] { this.Textbox1, ControlProperty.Text, this.Textbox1.Text, this.Checkbox1, ControlProperty.Checked, this.Checkbox1.Checked, this.Menu1, ControlProperty.SelectedValue, this.Menu1.SelectedValue };
        string txt = "";
        for (int i = 0; i < vals.Length; i += 3)
        {
            string controlID = (vals[i] as Control).ID;
            ControlProperty property = (ControlProperty)vals[i + 1];
            object state = vals[i + 2];
            txt += controlID + ":" + property.ToString() + ":" + state.ToString() + "\n";
        }
        string file = GetSettingsFile();
        File.WriteAllText(file, txt);
    }

    private void LoadSettings()
    {
        string file = GetSettingsFile();
        string[] lines = File.ReadAllLines(file);
        foreach (string s in lines)
        {
            string[] parts = s.Split(':');
            if (parts.Length < 3) continue;
            string id = parts[0];
            var c = this.form1.FindControl(id);
            ControlProperty prop = ControlProperty.None;
            Enum.TryParse<ControlProperty>(parts[1], out prop);
            string state = parts[2];
            if (c is TextBox && prop == ControlProperty.Text)
            {
                TextBox t = c as TextBox;
                t.Text = state;
            }
            else if (c is CheckBox && prop == ControlProperty.Checked)
            {
                CheckBox chk = c as CheckBox;
                chk.Checked = state == "True";
            }
            else if (c is Menu && prop == ControlProperty.SelectedValue)
            {
                Menu m = c as Menu;
                foreach (MenuItem menuItem in m.Items)
                {
                    if (menuItem.Value == state)
                    {
                        menuItem.Selected = true;
                    }
                }
            }
        }
    }
于 2018-12-29T16:56:00.940 回答