【问题标题】:How can I save and load textbox values, checkbox states, dropdown menu selections, etc., into a .txt file?如何将文本框值、复选框状态、下拉菜单选择等保存并加载到 .txt 文件中?
【发布时间】:2018-12-29 15:16:47
【问题描述】:

我正在尝试在我的应用程序中实现一个简单的保存加载功能,它将我的应用程序中各种 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 文件中为特定元素选择正确的值。

【问题讨论】:

    标签: user-interface configuration save state-saving


    【解决方案1】:
       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;
                        }
                    }
                }
            }
        }
    

    【讨论】:

    • 谢谢,这是非常自动化的,但我希望将所有想要保存在列表中的控件,就像我编写的示例中一样,因为我不想保存所有元素 - 只是其中的大部分。
    • 您更喜欢对控件进行硬编码,即 object[] myControls = new object[]{this.Testbox1, this.Checkbox1};并遍历它?
    • 几乎,稍作更正:不是对象本身,而是这些对象的特定属性,如 TestBox1.Text、Checkbox1.Checked 等。在您的示例中,保存加载功能很重要选择正确的属性(.text、.checked 等),但我想自己在 Controls 数组中指定。
    • 我已经修改了我的答案。希望对你有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多