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: c# form - tvorba listu s uloženými parametry (defaultní nastavení) programu

Aktivity
Avatar
Michaal.K
Člen
Avatar
Michaal.K:27.4.2016 13:55

Ahoj,
mám dvě třídy CommConfig a ItemCommConfig. V první třídě mám definici dvou listu nastaveniZarizeni, defaultniNasta­veniZariz (zde by mělo být uloženo defaultní nastavení) a metody pro přístup k těmto listům. Druhá třída vytváří položky pro listy. Na začátku programu překopíruji první list do druhého tím mi vznikne defaultní list a ten neměním. Druhý list může uživatel za běhu programu měnit. Teď jde o to, že když já přes metodu NastavNazevPrist() změním položku v listu nastaveniZarizeni, tak se mi změní i v listu defaultniNasta­veniZariz a to já nechci. Díky za pomoc a rady.

class ItemCommConfig
{
        public SerialPort ComPort { get; set; }
        public string TypZar { get; set; }
        public bool DefaultNast { get; set; }
        public string CteciBunka { get; set; }
        public string ZapisovaBunka { get; set; }

        public ItemCommConfig(SerialPort comPort, string typZar, bool defaultNast, string cteciBunka, string zapisovaBunka)
        {
            this.ComPort = comPort;
            this.TypZar = typZar;
            this.DefaultNast = defaultNast;
            this.CteciBunka = cteciBunka;
            this.ZapisovaBunka = zapisovaBunka;
        }
}

class CommConfig
{
        private static CommConfig instance;
        public static CommConfig Instance
        {
            get
            {
                if (instance == null)
                    instance = new CommConfig();
                return instance;
            }
        }

        private List<ItemCommConfig> nastaveniZarizeni;
        private List<ItemCommConfig> defaultniNastaveniZariz;

        public void NastavNazevPrist(int indexPristroje, string nazev)
        {
            nastaveniZarizeni[indexPristroje].TypZar = nazev;
        }
}
 
Odpovědět
27.4.2016 13:55
Avatar
LacoS.
Člen
Avatar
Odpovídá na Michaal.K
LacoS.:27.4.2016 15:03

skus zadefinovat a zaroven aj vytvorit tie dve 'nastavenia':

private List<ItemCommConfig> nastaveniZarizeni = new List<ItemCommConfig>();
private List<ItemCommConfig> defaultniNastaveniZariz = new List<ItemCommConfig>();

(mozno budes portebovat vlozit parametre alebo vytvorit defaultny konstruktor)

 
Nahoru Odpovědět
27.4.2016 15:03
Avatar
Michaal.K
Člen
Avatar
Odpovídá na LacoS.
Michaal.K:27.4.2016 15:42

Ahoj,
díky za odpověď, list nastaveniZarizeni mám nadefinovaný v konstruktoru, viz kód níže jen jsem ho zapomněl přidat do předchozího příspěvku.

private CommConfig()
{
        nastaveniZarizeni = new List<ItemCommConfig> {
        new ItemCommConfig(new SerialPort("COM1", 115200, Parity.None, 8, StopBits.One),"Multimetr", false, "AC3", "Y3") {},
        new ItemCommConfig(new SerialPort("COM2", 19200, Parity.None, 8, StopBits.One),"Generator", false, "AD3", "Y3") {},
        new ItemCommConfig(new SerialPort("COM3", 19200, Parity.None, 8, StopBits.One),"Dekada", false, "AE3", "Y3") {},
        new ItemCommConfig(new SerialPort("COM4", 19200, Parity.None, 8, StopBits.One),"Zdroj", false, "AF3", "Y3") {},
        new ItemCommConfig(new SerialPort("COM5", 19200, Parity.None, 8, StopBits.One),"Rezerva 1", false, "AG3", "Y3") {}};
}

A do druhého listu defaultniNasta­veniZariz v metodě ZkopirujDefau­ltDatabazi() zkopíruji ten první:

public void ZkopirujDefaultDatabazi()
{
        defaultniNastaveniZariz = new List<ItemCommConfig>(nastaveniZarizeni);
}

A teď když v metodě NastavNazevPrist() změním položku v listu nastaveniZarizeni, tak se mi změní i v listu defaultniNasta­veniZariz.... A nevím co stím.

 
Nahoru Odpovědět
27.4.2016 15:42
Avatar
Odpovídá na Michaal.K
Petr Štechmüller:27.4.2016 15:49

Ahoj, je to způsobené tím, že když vytváříš nový list defaultniNasta­veniZariz, tak mu předáš referenci na existující list nastaveniZari­zeni, který uchovává reference na konkrétní nastevení. Takže když změníš hodnotu v jednom listu, tak se logicky změní i v druhém, protože na změněnou položku ukazuje stejná reference co je v defaultniNasta­veniZariz i ta, co je v nastaveniZari­zeni.
Takže řešení by bylo udělat něco jako hlubokou kopii těch položek při vytváření listu defaultniNasta­veniZariz, nebo prostě vytvoříš znovu všechny položky stejně, jako jsi to dělal s předchozím listem.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
27.4.2016 15:49
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Michaal.K
Člen
Avatar
Odpovídá na Petr Štechmüller
Michaal.K:28.4.2016 8:01

Ahoj, díky za vysvětlení mého problému :-) Chtěl jsem se tě zeptat co přesně myslíš pod tím udělat hloubkovou kopii? Nemohl bys mi to upřesnit?
Tu druhou možnost myslíš nekopírovat listy do sebe přes:
defaultniNasta­veniZariz = new List<ItemCommCon­fig>(nastaveni­Zarizeni);
ale normálně přidávat položky přes add?
Díky moc.

 
Nahoru Odpovědět
28.4.2016 8:01
Avatar
Odpovídá na Michaal.K
Petr Štechmüller:28.4.2016 8:28

Ano, normálně pres add.

Nahoru Odpovědět
28.4.2016 8:28
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Nahoru Odpovědět
28.4.2016 9:58
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Michaal.K
Člen
Avatar
Odpovídá na Petr Štechmüller
Michaal.K:28.4.2016 14:24

Tak jsem zkusil jak jsi poslal ten odkaz... Do defaultního listu teď kopíruji takto:

public void ZkopirujDefaultDatabazi()
        {
            defaultniNastaveniZariz = nastaveniZarizeni.ConvertAll(zaznam => new ItemCommConfig(zaznam.ComPort, zaznam.TypZar, zaznam.DefaultNast, zaznam.CteciBunka, zaznam.ZapisovaBunka));
        }

A už to skoro funguje jak má :-)
Ale teď když v listu nastaveniZarizeni změním položku comPort tak se mi zase změní v listu defaultniNasta­veniZariz.
Ostatni položky (TypZar, DefaultNast, CteciBunka, ZapisovaBunka) už fungují správně, když je změním v listu nastaveniZarizeni tak se mi nezmění v defaultniNasta­veniZariz.
Položku comPort v listu nastaveniZarizeni měním takto:

public SerialPort ComPort(int indexPortu)
{
           return nastaveniZarizeni[indexPortu].ComPort;
}

public void NastavComPort(int indexPristroje, SerialPort comPort)
{
            nastaveniZarizeni[indexPristroje].ComPort = comPort;
}

Takto nastavuji port:

SerialPort comPort = databazePristroju.ComPort(i);
comPort.BaudRate = "19200");
comPort.Parity = "None");
comPort.StopBits = "One");
databazePristroju.NastavComPort(i, comPort);

Díky

 
Nahoru Odpovědět
28.4.2016 14:24
Avatar
Odpovídá na Michaal.K
Petr Štechmüller:28.4.2016 14:26

Tak to je zase stejný problém. Musíš vytvořit i novou instanci toho SerialPortu

Nahoru Odpovědět
28.4.2016 14:26
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Michaal.K
Člen
Avatar
Odpovídá na Petr Štechmüller
Michaal.K:28.4.2016 14:42

No a to právě nevím jak ji vytovořit dotohohle:

defaultniNastaveniZariz = nastaveniZarizeni.ConvertAll(zaznam => new ItemCommConfig(zaznam.ComPort, zaznam.TypZar, zaznam.DefaultNast, zaznam.CteciBunka, zaznam.ZapisovaBunka));
 
Nahoru Odpovědět
28.4.2016 14:42
Avatar
Odpovídá na Michaal.K
Petr Štechmüller:28.4.2016 14:48

místo

zaznam.ComPort

Budeš psát něco ve stylu

new SerialPort(sem vlozis parametry toho comportu)
Editováno 28.4.2016 14:49
Nahoru Odpovědět
28.4.2016 14:48
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Michaal.K
Člen
Avatar
Odpovídá na Petr Štechmüller
Michaal.K:28.4.2016 14:55

Jj to mě taky napadlo :-) , ale já potřebuji aby se nastavení tech comportu vzalo z listu nastaveniZari­zeni....

 
Nahoru Odpovědět
28.4.2016 14:55
Avatar
Odpovídá na Michaal.K
Petr Štechmüller:28.4.2016 15:00
defaultniNastaveniZariz = nastaveniZarizeni.ConvertAll(zaznam => new ItemCommConfig(new SerialPort(zaznam.ComPort.PortName, zaznam.ComPort.BaudRate, zaznam.ComPort.Parity, zaznam.ComPort.StopBits), zaznam.TypZar, zaznam.DefaultNast, zaznam.CteciBunka, zaznam.ZapisovaBunka));

Zkontroluj si, jestli ty parametry v konstruktoru sedí správně

Editováno 28.4.2016 15:02
Nahoru Odpovědět
28.4.2016 15:00
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Michaal.K
Člen
Avatar
Odpovídá na Petr Štechmüller
Michaal.K:28.4.2016 15:09

Trochu jsem to upravil :-)

defaultniNastaveniZariz = nastaveniZarizeni.ConvertAll(zaznam => new ItemCommConfig(new SerialPort(zaznam.ComPort.PortName, zaznam.ComPort.BaudRate, zaznam.ComPort.Parity, zaznam.ComPort.DataBits,zaznam.ComPort.StopBits), zaznam.TypZar, zaznam.DefaultNast, zaznam.CteciBunka, zaznam.ZapisovaBunka));

Teď už to snad funguje jak má.... Ještě jednou díky moc.

 
Nahoru Odpovědět
28.4.2016 15:09
Avatar
Odpovídá na Michaal.K
Petr Štechmüller:28.4.2016 15:11

Není zaco, hodně štěstí...

Editováno 28.4.2016 15:12
Nahoru Odpovědět
28.4.2016 15:11
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
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 15 zpráv z 15.