Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Vytvoření konfiguráku pomocí JaSONu

Aktivity
Avatar
Daniel Semerák:8.9.2020 8:40

Zdravím.
Rád bych pro svůj program vytvořil settings, kam by se ukládalo současné nastavení v programu a četlo si to z něj při spuštění.
Prostě, aby se mi tam uložil stávající stav RadioButtonů, CheckBoxu, ComboBoxů atd.
Vím, že většina to dělá v XML, ale já bych rád to provedl v JaSONu, který mi přijde přehlednější a jednodušší.
S C# teprve začínám a učím se ho, takže zdatný vůbec nejsem a jak tohle vyřešit také nevím.
Už mám ale hotové čtení ze souborů a uložení dat do TeXTáků ohledně jiných dat.
Mám dvě okna, kde se spustí jedno, po kliknutí na Button se zavře a otevře se druhé.
To mi chodí, to už mám vyřešené.

Chci docílit: V obou používám RadioButtony, CheckBoxy a ComboBoxy a já bych, aby se mi při zavření programu současný stav uložil a zůstal zachovaný při opětovném spuštění.
Zatím mám vše jen v defaultu, který jsem si nastavil při vytváření kodu.
Vím, že to je až moc obecný dotaz, ale za každé nakopnutí správným směrem budu moc rád. :-)

 
Odpovědět
8.9.2020 8:40
Avatar
Odpovídá na Tadeáš Burda
Daniel Semerák:8.9.2020 12:23

Díky za tip. :-)

 
Nahoru Odpovědět
8.9.2020 12:23
Avatar
Daniel Semerák:9.9.2020 15:37

Tak jsem si to pročítal, ale pořád jsem z toho tumpachový a nevím, jak to vytvořit. :-(
V C# jsem pořád zatím jen pokročilý začátečník, takže hodně věcí je pro mne pořád nových a hlavně neznámých.
Zde uvádím kod, který už mám předpřipravený a ve kterém by se to všechno Nastavení mělo odehrávat.
Snad jsem začal dobře, nevím ...

using System;
using System.Collections.Generic;
using System.Text;
using Knihovna;

namespace Knihovna
{
    class Nastaveni
    {
        public int Jmeno { get; }
        //Dva RadioButtony (Form0)

        public int Jazyk { get; }
        //ComboBox - výběr jazyka a nastavení jako výchozího (Form0)

        public bool Zapnuto { get; }
        //CheckBox - bude zapínat (ukládat a načítat stávající nastavení) a vypínat (Form0)

        public int PridatHeslo { get; }
        //Tři RadioButtony (Form1)

        public int VyberHesla { get; }
        //ComboBox (Form1)

        public int SeznamHesel { get; }
        //ComboBox - přidávání hesel do CmbBoxu (Form1)

        public bool Sbernice { get; }
        //CheckBox (Form1)

        public int Cisla { get; }
        //Tři RadioButtony (Form1)
    }
}
 
Nahoru Odpovědět
9.9.2020 15:37
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Daniel Semerák
Tadeáš Burda :10.9.2020 15:07

Ako ďaleko si v kurzoch tu na ITnewtorku?

 
Nahoru Odpovědět
10.9.2020 15:07
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Daniel Semerák
Tadeáš Burda :10.9.2020 15:59
using System;
using System.IO;
using System.Text.Json;

namespace ConsoleApp1
{
    class Program
    {
        private class Settings
        {
            public string Name { get; set; }

            public int Language { get; set; }

            public bool IsON { get; set; }
        }

        static void Main(string[] args)
        {
            // vytvorý .json
            Settings settings = new Settings()
            {
                Name = "ExampleName",
                Language = 1,
                IsON = true
            };
            SerializeJSON<Settings>(settings);

            // načíta .json
            Settings settings1 = DeserializeJSON<Settings>();
            Console.WriteLine($"Settings: {settings1.Name}, {settings1.Language}, {settings1.IsON}");

            Console.ReadLine();
        }

        static T DeserializeJSON<T>() where T : class
        {
            string s = File.ReadAllText("config.json");
            return JsonSerializer.Deserialize<T>(s);
        }

        static void SerializeJSON<T>(T obj) where T : class
        {
            string s = JsonSerializer.Serialize<T>(obj);
            File.WriteAllText("config.json", s);
        }
    }
}
 
Nahoru Odpovědět
10.9.2020 15:59
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Daniel Semerák
Tadeáš Burda :10.9.2020 16:03

Joo a ešte keď máš class tak tie vlastnosti musia mať aj { set; }, inak ti to nepôjde načítať keďže tá metoda by nemala ako vložiť tie hodnoty do tých vlastností. Ak ti to nejde, alebo tomu nechápeš tak je to nad tvoje sily a mal by si si prejsť ešte niake kurzy a toto skúsiť inokedy :-) Nemáš zač

 
Nahoru Odpovědět
10.9.2020 16:03
Avatar
Daniel Semerák:10.9.2020 16:49

Zatím mám vytvořené - předpřipravené jen tohle: class pro výchozí nastavení a class pro práci s nastavením.
Jinak nepoužívám Console, ale jen TextBox a RichTextBox.

using System;
using System.Collections.Generic;
using System.Text;
using Knihovna;

namespace Knihovna
{
    public class VychoziNastaveni
    {
        public int Jmeno { get; set; }
        //Dva RadioButtony (Form0) - RdbUser.Checked = true;

        public int Jazyk { get; set; }
        //ComboBox výběr jazyka a nastavení jako výchozího (Form0) - IcbLokalizace.SelectItem(0);

        public bool Zapnuto { get; set; }
        //CheckBox - bude zapínat (ukládat a načítat stávající nastavení) a vypínat (Form0) - ChbPamatovatUuzivatele.Checked = true;

        public int PridatHeslo { get; set; }
        //Tři RadioButtony (Form1) - RdbHeslo.Checked = true;

        public int VyberHesla { get; set; }
        //ComboBox (Form1) - CmbHeslo.SelectedIndex = 0;

        public int SeznamHesel { get; set; }
        //ComboBox - přidávání hesel do CmbBoxu (Form1)
        /*CmbHeslo.Items.Add("Text1");
        CmbHeslo.Items.Add("Text2");
        CmbHeslo.Items.Add("Text3");
        CmbHeslo.Items.Add("Text4");
        CmbHeslo.Items.Add("Text5");
        CmbHeslo.Items.Add("Text6");
        CmbHeslo.Items.Add("Text7");*/

        public bool Sbernice { get; set; }
        //CheckBox (Form1) - ChbZabezpecenyPrenos.Checked = false;

        public int Cisla { get; set; }
        //Tři RadioButtony (Form1) - RdbObeCisla.Checked = true;
    }

    public class PraceSNastavenim
    {
        public int Jmeno { get; set; }
        //Dva RadioButtony (Form0)

        public int Jazyk { get; set; }
        //ComboBox výběr jazyka a nastavení jako výchozího (Form0)

        public bool Zapnuto { get; set; }
        //CheckBox - bude zapínat (ukládat a načítat stávající nastavení) a vypínat (Form0)

        public int PridatHeslo { get; set; }
        //Tři RadioButtony (Form1)

        public int VyberHesla { get; set; }
        //ComboBox (Form1)

        public bool Sbernice { get; set; }
        //CheckBox (Form1)

        public int Cisla { get; set; }
        //Tři RadioButtony (Form1)
    }
}
 
Nahoru Odpovědět
10.9.2020 16:49
Avatar
Odpovídá na Tadeáš Burda
Daniel Semerák:10.9.2020 16:52

Tadeáš> Máš pravdu, jsem teprve na začátku a sice jsem si ty kursy pročítal, ale stále mi to není moc jasné. :-(
Vytvářením toho programu se zároven i učím C#.
Prostě se učím a programuji za chodu. :-)
Sice základy už tak nějak zvládám a chápu, ale na hodně věcí bych pořád potřeboval min. Vyšší Dívčí anebo pořádný kurs pro začátečníky i pokročilé, ale to je zatím na mě moc drahé. :-(

Editováno 10.9.2020 16:54
 
Nahoru Odpovědět
10.9.2020 16:52
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Daniel Semerák
Tadeáš Burda :10.9.2020 17:00

Ok, ak ti to ide konvertovať na JSON tak good, môžeš to označiť ako správnu odpoveď. Ako napíšeš ten program to už je natebe, alebo založ nové vlákno možno ti niekto helpne. PS: Rob aj tie cvičenia, len čítať ti nestačí. PS1: Aj serveri treba z niečoho platiť :-` taký je život

 
Nahoru Odpovědět
10.9.2020 17:00
Avatar
Daniel Semerák:10.9.2020 17:00

Ještě řeším problém, jak propojit Nastaveni.cs s Login.cs (Form0) a s hlavním Form.cs (Form1).

 
Nahoru Odpovědět
10.9.2020 17:00
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Daniel Semerák
Tadeáš Burda :10.9.2020 17:34

A ide ti serializovať tu triedu nastavenia?

 
Nahoru Odpovědět
10.9.2020 17:34
Avatar
Odpovídá na Tadeáš Burda
Daniel Semerák:10.9.2020 17:59

To ještě plně neumím - nebo spíše to nechápu, ačkoli jsem si přečetl ten návod, ale stejně tomu moc nerozumím, abych dokázal dle toho sestavit vlastní kod. :-(

 
Nahoru Odpovědět
10.9.2020 17:59
Avatar
Tadeáš Burda
Brigádník
Avatar
Odpovídá na Daniel Semerák
Tadeáš Burda :10.9.2020 18:10

Dobre, tak nic... Proste: Všade kde je moja trieda "Settings" dáš tvoju "Nastavenia" a bude to fungovať. Či to je Console alebo WF to je jedno. Každopádne si myslím že to je dosť nad tvoje možnosti a mal by si sa račej ešte učiť, potom sa ktomu vráť. Alebo to skúšaj ale ja ti nemám čo poradiť.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
10.9.2020 18:10
Avatar
JerryM
Člen
Avatar
JerryM:10.9.2020 19:18

Tak nepoužívej JSON ale XML, no ono to stejně vyjde nastejno ...
XML soubor otevřeš a celej načteš do paměti a pak děláš upravy a pak ho celej zapišeš
tady máš kompletní kod jak se to dělá, protože serializovat kompletní třídy je strašná práce, to snad nikdo nedělá
zapisuješ jenom stav buttonů, checkboxů atd ...

konfigurační soubor na disku vypadá takhle a sestavit si ho musíš ručně

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<root>
  <THID_EPSDE_M_DT_Classification>
    <Reload_at_start>True</Reload_at_start>
    <Write_to_RTB_enabled>False</Write_to_RTB_enabled>
    <AlgorithmType>4</AlgorithmType>
    <EA_useHybridOF_multiplier>50</EA_useHybridOF_multiplier>
    <EA_useAutoSave>True</EA_useAutoSave>
  </THID_EPSDE_M_DT_Classification>
</root>

načtení žádoucího stavu z XML souboru a nastavení korespondujících kontrols vypadá takhle

gs_R.ConfigAdmin.OpenConfigFile();
          this.checkBox1.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "Reload_at_start"));
          this.checkBox15.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "Write_to_RTB_enabled"));
          this.checkBox23.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "EA_graphics_output_enabled"));
gs_R.ConfigAdmin.OpenConfigFile();


          this.checkBox1.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "Reload_at_start"));

          this.checkBox15.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "Write_to_RTB_enabled"));
          this.checkBox23.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "EA_graphics_output_enabled"));
gs_R.ConfigAdmin.OpenConfigFile();
          this.checkBox1.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "Reload_at_start"));

          this.checkBox15.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "Write_to_RTB_enabled"));
          this.checkBox23.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "EA_graphics_output_enabled"));
          gs_R.ConfigAdmin.CloseConfigFile();

zápis současného stavu controls do XML souboru vypadá takhle

gs_R.ConfigAdmin.OpenConfigFile();
          gs_R.ConfigAdmin.PutStringValueByID("THID_EPSDE_M_DT_Classification", "Reload_at_start", Convert.ToString(this.checkBox1.Checked));
          gs_R.ConfigAdmin.PutStringValueByID("THID_EPSDE_M_DT_Classification", "Write_to_RTB_enabled", Convert.ToString(this.checkBox15.Checked));
          gs_R.ConfigAdmin.PutStringValueByID("THID_EPSDE_M_DT_Classification", "EA_graphics_output_enabled", Convert.ToString(this.checkBox23.Checked));
          gs_R.ConfigAdmin.CloseConfigFile();

a ovládaní modul c Csharp vypadá takhle

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

using System.ComponentModel;
using System.Collections;
using System.Windows.Forms;
using System.Data;
using System.Drawing;
using System.IO;
using System.Xml;

using Microsoft.Win32; // NEVER EVER USE WITH System.Core.dll !!!


namespace Test
{
    public partial class ConfigAdmin
    {

       public static String g_Test_mainDirectory;
       public static String g_registry_key;
       public static String g_Test_configFile;
       public static String g_Test_configFile_nameAndPath;

       public static XmlDocument g_xmldoc;


        static ConfigAdmin()
        {
            g_xmldoc = null;

            g_Test_mainDirectory = "";
            g_Test_configFile = "Test config file.xml";
            g_registry_key = "HKEY_CURRENT_USER\\Software\\Test 1.0\\Main Folder";

        }// ConfigAdmin()

        //
        //*********************************************


        // ConfigAdmin::
        public System.Boolean OpenConfigFile()
        {
        // OpenConfigFile( ) {

        //*********************************************

           if (g_xmldoc != null)
           {
              return false;
           }// if

           // registry_key = "HKEY_CURRENT_USER\\Software\\Test 1.0\\Main Folder";
           if ( Microsoft.Win32.Registry.GetValue(g_registry_key, "Path", null) == null)
           {

               MessageBox.Show("Windows registry does not contain requested information.\n" +
                               "Working directory key missing: HKEY_CURRENT_USER\\Software\\Test 1.0\\Main Folder\\Path = String: ??? \n" +
                               "Working directory unknown.", "Config file...",
                               MessageBoxButtons.OK);

               return false;

           }//

           g_Test_mainDirectory = Microsoft.Win32.Registry.GetValue(g_registry_key, "Path", "").ToString(); //
           g_Test_configFile_nameAndPath = g_Test_mainDirectory + "\\" + g_Test_configFile;

           if (System.IO.File.Exists(g_Test_configFile_nameAndPath) == false)
           {

              MessageBox.Show("ERROR: Config file does not exist !", "Config file processing...", MessageBoxButtons.OK);
              return false;

           }// if

           FileStream fs = new FileStream(g_Test_configFile_nameAndPath, FileMode.Open, FileAccess.Read);

           g_xmldoc = new XmlDocument();

           g_xmldoc.Load(fs);

           fs.Close();

           fs = null;

           return true;

        }// public System.Boolean OpenConfigFile()


        // ConfigAdmin::
        public void CloseConfigFile()
        {
           // PutStringValueByID

           //*********************************************

           if (g_xmldoc == null)
           {
                return;
           }// if

           g_xmldoc.Save(g_Test_configFile_nameAndPath);
           g_xmldoc = null;

        }//  System::Void ConfigAdmin::CloseConfigFile( )


        // ConfigAdmin::
        public System.String GetStringValueByID( String t_name, String t_ID )
        {
           // GetStringValueByID

           XmlNodeList xmlNodeList = null;

           //*********************************************

           xmlNodeList = g_xmldoc.GetElementsByTagName( t_name );

           if ( xmlNodeList.Count == 0 ) {
              return "";
           }// if

           xmlNodeList = xmlNodeList[0].ChildNodes;

           if ( xmlNodeList.Count == 0 ) {
              return "";
           }// if

           for ( Int32 i = 0; i < xmlNodeList.Count; i++ ) {

               if ( xmlNodeList[i].Name == t_ID ) {

                  return xmlNodeList[i].InnerText;

               }// if

           }// for i

           return "";

        }// public System.String GetStringValueByID


        // ConfigAdmin::
        public System.String PutStringValueByID( String t_name, String t_ID, String t_strValue )
        {
           // PutStringValueByID

           //String line = "";

           XmlNodeList xmlNodeList = null;

           //*********************************************


           xmlNodeList = g_xmldoc.GetElementsByTagName( t_name );

           if ( xmlNodeList.Count == 0 ) {
              return "";
           }// if

           xmlNodeList = xmlNodeList[0].ChildNodes;

           if ( xmlNodeList.Count == 0 ) {
              return "";
           }// if

           for ( Int32 i = 0; i < xmlNodeList.Count; i++ ) {

               if ( xmlNodeList[i].Name == t_ID ) {

                  xmlNodeList[i].InnerText = t_strValue;
                  return t_strValue;

               }// id

           }// for i

           return "";


        }// PutStringValueByID( String t_name, String t_ID, String t_strValue )



    }// class ConfigAdmin

}// Namespace Test
 
Nahoru Odpovědět
10.9.2020 19:18
Avatar
JerryM
Člen
Avatar
JerryM:10.9.2020 19:21

a chybička se vloudila .... načtení stavu ještě jednou
načtení žádoucího stavu z XML souboru a nastavení korespondujících kontrols vypadá takhle

gs_R.ConfigAdmin.OpenConfigFile();
          this.checkBox1.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "Reload_at_start"));
          this.checkBox15.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "Write_to_RTB_enabled"));
          this.checkBox23.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "EA_graphics_output_enabled"));
          this.checkBox15.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "Write_to_RTB_enabled"));
          this.checkBox23.Checked = Convert.ToBoolean(gs_R.ConfigAdmin.GetStringValueByID("THID_EPSDE_M_DT_Classification", "EA_graphics_output_enabled"));
          gs_R.ConfigAdmin.CloseConfigFile();
 
Nahoru Odpovědět
10.9.2020 19:21
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 17 zpráv z 17.