IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.
Avatar
Petr Adámek
Člen
Avatar
Petr Adámek:4.4.2020 12:32

Ahoj
Zkouším průběně aktualizovat aktuálně dostupné sériové porty do comboboxu. Porty jsou uloženy v poli.

Zkusil jsem: Zkoušel jsem pomocí timertick mazat a následně znovu nahrávat porty. Kod pro nahrani a zapis portu do comboboxu.

ports = SerialPort.GetPortNames();
Array.Sort(ports);
foreach (string port in ports)
{
    comboBox1.Items.Add(port);
    Console.WriteLine(port);
    if (ports[0] != null)
    {
        comboBox1.SelectedItem = ports[0];
    }
}

Chci docílit: Chci dosáhnout aktualizovaného comboboxu s dostupnými porty. Aktualní idea je porovnávat pole ports s načtenými porty v comboxu a v případě neshody odstranit/přidat port. Jak by bylo možné provést porovnání, případně zajistit aktualizaci jiným způsobem?

 
Odpovědět
4.4.2020 12:32
Avatar
Jaroslav Smrž
Tvůrce
Avatar
Odpovídá na Petr Adámek
Jaroslav Smrž:4.4.2020 21:34

Ahoj, pokud to chceš aktualizovat pravidelně, přidej si timer, kde si nastavíš interval, který znovu zavolá metodu pro získání portů.

Nahoru Odpovědět
4.4.2020 21:34
/* Life runs on code */
Avatar
Petr Adámek
Člen
Avatar
Petr Adámek:5.4.2020 11:14

Ahoj Jardo
Souhlasím, tenhle způsob jsem vyzkoušel. Je třeba trošku poupravit kód ale i pak je problém. Maže se vybraný port a při otevřeném comboboxu a vybírání portu pomocí myši se ,,odznačuje,, právě vybraná položka.
viz. https://www.youtube.com/watch?…

private void timer1_Tick(object sender, EventArgs e)
{
    comboBox1.Items.Clear();
    ports = SerialPort.GetPortNames();
    Array.Sort(ports);
    foreach (string port in ports)
    {
        comboBox1.Items.Add(port);
        Console.WriteLine(port);
    }
}
 
Nahoru Odpovědět
5.4.2020 11:14
Avatar
Petr Adámek
Člen
Avatar
Petr Adámek:5.4.2020 11:29

Mám k dispozici pole portů, které získávam přes timer. Nejlepší by podle mě bylo porovnat, jestli se načtené porty v poli shodují s porty v comboboxu. Pokud by se neshodovaly, odebral by se port z comboboxu, který už v poli není a případně se nahradil jiným, který v poli je. Jak by šlo tohle provést, existuje metoda pro výpis celkového obsahu comboboxu který bych následně použil k porovnání?

 
Nahoru Odpovědět
5.4.2020 11:29
Avatar
Jaroslav Smrž
Tvůrce
Avatar
Odpovídá na Petr Adámek
Jaroslav Smrž:6.4.2020 20:45

Ahoj, to, co navrhuješ je určitě jedna z možností, ale udělal bych to tak, že timer použije nové pole, které porovná s původním a teprve pokud nebudou pole stejná, aktualizuje se combobox. Jednodušší mi však přijde zavolat ten timer nebo samotnou metodu pro získání portů kliknutím na rolovačku. Další možností by bylo ponechat vybraný port (selected) v proměnné aby nedošlo k přepsání vybraného portu. Když by se ti nedařilo, tak dej vědět a já ti pošlu kód.

Nahoru Odpovědět
6.4.2020 20:45
/* Life runs on code */
Avatar
zelvicek
Člen
Avatar
Odpovídá na Petr Adámek
zelvicek:7.4.2020 13:15

Zkus nepoužívat cb.Items.Clear() a dělat jen rozdílové úpravy pomocí cb.Items.Add a cb.Items.Remo­ve/RemoveAt.

 
Nahoru Odpovědět
7.4.2020 13:15
Avatar
Jan Stodůlka
Tvůrce
Avatar
Jan Stodůlka:8.4.2020 15:44

Nebo můžeš místo Items použít DataSource a nahradit celou kolekci najednou. Před změnou si uchováš vybranou položku a po změně ji zkusíš nastavit zpět.

Ještě by to šlo vylepšit. Provést refresh comboboxu až poté co získá focus, ušetříš tak výkon potřebný na opakované získávání portů, které bude povětšinou zbytečné.

Nahoru Odpovědět
8.4.2020 15:44
Nechodím do hospody, protože doma programuji.
Avatar
Petr Adámek
Člen
Avatar
Petr Adámek:9.4.2020 10:08

Ahoj
Pokoušel jsem o způsob srovnání dvou polí, pokud by byl obsah rozdílný, pole se přepíše a aktualizuje v cb, ale narazil jsem.. Pokud není připojený port, program padá.

private void timer1_Tick(object sender, EventArgs e)
{

    ports = SerialPort.GetPortNames();
    //Array.Sort(portss);
    foreach (string port in ports)
    {
        if (ports[0] != null)
        {

            if (String.Equals(ports[0], portss[0]))
            {

            }
            else
            {
                label2.Text = "probehlo";
                comboBox1.Items.Clear();
                comboBox1.Items.Add(port);

                    if (ports[0] != null)
                    {
                        comboBox1.SelectedItem = ports[0];
                    }

                portss[0] = ports[0];
            }

        }

Nevadilo by ti poslat kód?

 
Nahoru Odpovědět
9.4.2020 10:08
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 8 zpráv z 8.