Diskuze: c# form - tvorba listu s uloženými parametry (defaultní nastavení) programu

C# .NET .NET (C# a Visual Basic) c# form - tvorba listu s uloženými parametry (defaultní nastavení) programu American English version English version

Avatar
Michaal.K
Člen
Avatar
Michaal.K:

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. dubna 13:55
Avatar
LacoS.
Člen
Avatar
Odpovídá na Michaal.K
LacoS.:

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. dubna 15:03
Avatar
Michaal.K
Člen
Avatar
Odpovídá na LacoS.
Michaal.K:

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. dubna 15:42
Avatar
Odpovídá na Michaal.K
Petr Štechmüller:

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í
+1 bodů
Řešení problému
Nahoru Odpovědět 27. dubna 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:

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. dubna 8:01
Avatar
Nahoru Odpovědět 28. dubna 8:28
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Nahoru Odpovědět 28. dubna 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:

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. dubna 14:24
Avatar
Odpovídá na Michaal.K
Petr Štechmüller:

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

Nahoru Odpovědět 28. dubna 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:

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. dubna 14:42
Avatar
Odpovídá na Michaal.K
Petr Štechmüller:

místo

zaznam.ComPort

Budeš psát něco ve stylu

new SerialPort(sem vlozis parametry toho comportu)
Editováno 28. dubna 14:49
Nahoru Odpovědět 28. dubna 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:

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

 
Nahoru Odpovědět 28. dubna 14:55
Avatar
Odpovídá na Michaal.K
Petr Štechmüller:
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. dubna 15:02
Nahoru Odpovědět 28. dubna 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:

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. dubna 15:09
Avatar
Odpovídá na Michaal.K
Petr Štechmüller:

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

Editováno 28. dubna 15:12
Nahoru Odpovědět 28. dubna 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.