0

アプリケーション内のさまざまな GUI 要素 (テキストボックス、チェックボックス、ドロップダウン メニューなど) の状態をカスタム名の .txt ファイルに保存する単純なセーブ/ロード機能をアプリケーションに実装しようとしています。次回ユーザーがアプリケーションを実行するときにそれらをロードし直します。My.Settings は移植可能なアプリケーションであるため、使用したくありません。したがって、設定ファイルは実行可能ファイルの隣に配置する必要があります。また、私のアプリケーションはエディターであり、ユーザーが作業している現在のファイルに設定を名前でバインドする必要があるためです。書き込み権限は問題ではありません。これをコード化して、コード内で 1 回言及する 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 に答える