Jak ustawić focus na element po zeskanowaniu kodu kreskowego?

Jak ustawić focus na element po zeskanowaniu kodu kreskowego?
XR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 13
1

Witam.
Mam tyci problem, którego nie potrafię rozwiązać - chodzi o odczyt kodu kreskowego.
Mam własną usercontrol (UC), którą wrzucam w tabControl.
Na tej UC mam splitcontainer (jego nazwa to splitContainer1 - w skrócie będzie sc1). Na sc1.Panel2 mam 2xlabel, textboxa (do niego będzie też można wczytywać kod kreskowy - tb_KKr), groupboxa z textboxem, potem dodam tam jeszcze kilka rzeczy.
Na sc1.Panel1 mam sc2. Na sc2.Panel1 mam Groupboxa z DataGridView (dgv_B). Na sc2.Panel2 jest też Groupbox z DataGridView (dgv_P).
Na dgv_B oraz tb_KKr mam zrobioną obsługę klawiszy (abym mógł czytać kod kreskowy). W tej obsłudze dałem sobie tymczasowo MessageBox (MB1) z odczytanym kodem.
Po wczytaniu UC jak zeskanuje kod kreskowy to za każdym razem wyskakuje MB1, po daniu OK mogę znów skanować i tak w kółko.
Dołożyłem funkcję, która ma mi obrabiać ten kod kreskowy (jak go nie znajdzie ma być odpowiedni MessageBox z informacją - MB2).
Tu się zaczynają problemy, bo jak przejdzie mi do MB1 i dam OK to już nie odczytuję żadnego kodu - nie pojawia się mi MB1.
Dobra ustawię focus na dgv_B i będzie git, no i się pomyliłem bo dgv_B.Select(), dgv_B.Focus() czy this.ActiveControl = dgv_B nie ustawiają mi focusu na dgv_B.
Sprawdzając co jest aktywne this.ACtiveControl.Name za każdym razem ustawia się sc1.
Mogę oczywiście za każdym razem kliknąć w tb_KKr i zeskanować kod ale to ma działać prawie bez obsługowo - tj. pracownik ma zeskanować kod, program ma obrobić dane i je wyświetlić, pracownik ponownie skanuje kod bez niepotrzebnego klikania w program (za wyjątkiem pewnym innych czynności typu wybór magazynu, dokumentu itp.).
Próbowałem zrobić obsługę klawiszy dla sc1 ale nie działa mi - skanuje kod ale nic nie wyświetla.
Jak ustawić focus na dgv_B (lub na tb_KKr) za każdym razem jak zeskanuję kod i go obrobię?
Pracuję na VS2017 i Win7.
Pozdrawiam

AD
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 342
0

Nic z tego nie rozumiem. Pokaż kod I opisz procesy jakie tam mają być

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
1

Nikt nie będzie analizować tego co tu napisałeś w takiej formie. Pokaż kod, napisz co robi a co powinien robić. Może jakieś screenshoty.
Może pomoże wskazówka żebyś nie używał messageboksów to nie będziesz tracić focusa. Focus ustawiasz przez Keyboard.Focus(textbox) jeśli to WPF ale nie napisałeś.

OT - czemu nie używasz najnowszego VS, przecież jest wstecznie kompatybilny?

XR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 13
0

Dopiero dziś znalazłem czas by odpisać (i dostać się zdalnie do kompa).
Program ma za zadanie zeskanowanie towaru, sprawdzenie danych w bazie i wydruk etykiety (przy okazji sprawdzi zgodność tego co przyszło z tym co dali na WZ).
@obscurity a potrafisz zainstalować najnowszego VS na Win7 - bo ja nie?
Poniżej zrzut jak wygląda kontrolka, tak samo kod.

Kopiuj
namespace Przyjęcia_magazyn.Zakladki
{
    public partial class PrzyjmijTowar : UserControl
    {
        MainForm mf;

        private bool kasuj_tb;
        string _barcode = "";
        int licznik = 0, lp = 0;

        DataTable dt_Bilans = new DataTable();
        DataTable dt_Towary = new DataTable();
        DataTable dt_Przyjete = new DataTable();

        BindingSource bs_Bilans = new BindingSource();
        BindingSource bs_Przyjete = new BindingSource();

        public PrzyjmijTowar(MainForm mainForm)
        {
            InitializeComponent();

            mf = mainForm;
                        
            
            //dt_Bilans.Columns.Add("", typeof());
            dt_Bilans.Columns.Add("Id_dom1", typeof(int));
            dt_Bilans.Columns.Add("Id_dom2", typeof(int));
            dt_Bilans.Columns.Add("Id_tow", typeof(int));
            dt_Bilans.Columns.Add("Nazwa", typeof(string));
            dt_Bilans.Columns.Add("Kod_1", typeof(string));
            dt_Bilans.Columns.Add("Kod_2", typeof(string));
            dt_Bilans.Columns.Add("Ilosc", typeof(double));
            dt_Bilans.Columns.Add("Cena", typeof(decimal));
            dt_Bilans.Columns.Add("Lokalizacja", typeof(string));
            dt_Bilans.Columns.Add("Podzielnik_metki", typeof(int));            

            //dt_Towary.Columns.Add("", typeof());
            dt_Towary.Columns.Add("Id_dom1", typeof(int));
            dt_Towary.Columns.Add("Id_dom2", typeof(int));
            dt_Towary.Columns.Add("Id_tow", typeof(int));
            dt_Towary.Columns.Add("Nazwa", typeof(string));
            dt_Towary.Columns.Add("Kod_1", typeof(string));
            dt_Towary.Columns.Add("Kod_2", typeof(string));
            dt_Towary.Columns.Add("Ilosc", typeof(double));
            dt_Towary.Columns.Add("Cena", typeof(decimal));
            dt_Towary.Columns.Add("Cena_spr_brutto", typeof(decimal));
            dt_Towary.Columns.Add("Lokalizacja", typeof(string));
            dt_Towary.Columns.Add("Podzielnik_metki", typeof(int));
            dt_Towary.Columns.Add("Druk_specjal", typeof(string));
            dt_Towary.Columns.Add("Kod_kreskowy", typeof(string));
            dt_Towary.Columns.Add("Krotnosc_kodu", typeof(int));

            //dt_Przyjete.Columns.Add("", typeof());
            dt_Przyjete.Columns.Add("Lp", typeof(int));
            dt_Przyjete.Columns.Add("Id_dom1", typeof(int));
            dt_Przyjete.Columns.Add("Id_dom2", typeof(int));
            dt_Przyjete.Columns.Add("Nr_dok", typeof(string));
            dt_Przyjete.Columns.Add("Id_kth", typeof(int));
            dt_Przyjete.Columns.Add("Kth_symbol", typeof(string));
            dt_Przyjete.Columns.Add("Id_tow", typeof(int));
            dt_Przyjete.Columns.Add("Kod_1", typeof(string));
            dt_Przyjete.Columns.Add("Kod_2", typeof(string));
            dt_Przyjete.Columns.Add("Nazwa", typeof(string));
            dt_Przyjete.Columns.Add("Ilosc_wprowadzona", typeof(double));
            dt_Przyjete.Columns.Add("Cena", typeof(decimal));
            dt_Przyjete.Columns.Add("Cena_spr_brutto", typeof(decimal));
            dt_Przyjete.Columns.Add("Lokalizacja", typeof(string));
            dt_Przyjete.Columns.Add("Kod_kreskowy", typeof(string));
            dt_Przyjete.Columns.Add("Suma_ilosc_towaru", typeof(double));
            dt_Przyjete.Columns.Add("Recznie_wybrane", typeof(bool));
            dt_Przyjete.Columns.Add("Multi_ilosc", typeof(double));
            dt_Przyjete.Columns.Add("Druk_specjal", typeof(string));

        }

        private void PrzyjmijTowar_Load(object sender, EventArgs e)
        {
            Ustaw_gridy(dgv_Bilans, dgv_Przyjete);

            if (mf.ibConn.State == ConnectionState.Closed) mf.ibConn.Open();
            if (mf.ibConn.State == ConnectionState.Open)
            {
                string komenda = "";
                try
                {
                    IBCommand selCmd = mf.ibConn.CreateCommand();
                    selCmd.CommandType = CommandType.StoredProcedure;
                    selCmd.CommandText = "select aid_dom1 as id_dom1, aid_dom2 as id_dom2, aid_tow as id_tow, anazwa as nazwa, akod_1 as kod_1, akod_2 as kod_2, ailosc as ilosc, acena as cena, acena_spr_brutto as cena_spr_brutto, alokalizacja as lokalizacja, apodzielnik_metki as podzielnik_metki, adruk_specjal as druk_specjal, akod_kreskowy as kod_kreskowy, akrotnosc_kodu as krotnosc_kodu from atp_pr_get_pz_tow_kkr(@iddom1, @iddom2, @idkth, @idmag)";                    
                    selCmd.Parameters.AddWithValue("@iddom1", mf.idDom1);
                    selCmd.Parameters.AddWithValue("@iddom2", mf.idDom2);
                    selCmd.Parameters.AddWithValue("@idkth", mf.idKth);
                    selCmd.Parameters.AddWithValue("@idmag", Convert.ToInt32(mf.dt_Ustawienia.Rows[0]["Domyslny_magazyn"]));

                    komenda = selCmd.CommandText;
                    foreach (IBParameter par in selCmd.Parameters) komenda = $"{komenda}\r\n{par.ParameterName}  |{par.Value}|";

                    IBDataAdapter da = new IBDataAdapter(selCmd);
                    da.Fill(dt_Towary);

                    if (dt_Towary.Rows.Count >0)
                    {
                        DataView dv = new DataView(dt_Towary);
                        dt_Bilans = dv.ToTable(true, "Id_dom1", "Id_dom2", "Id_tow", "Nazwa", "Kod_1", "Kod_2", "Ilosc", "Cena", "Lokalizacja", "Podzielnik_metki");
                    }
                }
                catch(IBException ex)
                {
                    MessageBox.Show($"PrzyjmijTowar Load\r\n{komenda}\r\n{ex}", "BŁĄD", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                finally
                {
                    mf.ibConn.Close();
                    bs_Bilans.DataSource = dt_Bilans;
                    dgv_Bilans.DataSource = bs_Bilans;
                }
            }


            bs_Przyjete.DataSource = dt_Przyjete;
            dgv_Przyjete.DataSource = bs_Przyjete;


        }

        private void Ustaw_gridy(DataGridView _dB, DataGridView _dP)
        {
            //wywaliłem bo za dużo było i nie wnosiło nic do problemu

        }

        private void Szukaj_towaru(string _kodkr, DataTable _towary, DataTable _przyjete, double _multi_ilosc, bool _recznie_wybrane, string _nr_dok, int _idkth, string _symbolKth)
        {
            int ile_etykiet = 0;
            double ilosc_wprowadzona = 0.0d;
            if (_kodkr != "")
            {
                DataRow[] drSel = _towary.Select($"Kod_kreskowy='{_kodkr}'");
                if (drSel.Length > 0)
                {
                    if (drSel.Length == 1)
                    {
                        tb_ZnalezionyTowar.Text = $"Kod_1: {drSel[0]["Kod_1"]}\r\nKod_2: {drSel[0]["Kod_2"]}\r\nNazwa: {drSel[0]["Nazwa"]}";
                        double suma_ilosci = 0;
                        DataRow[] drSPrzyj = _przyjete.Select($"Id_tow={drSel[0]["Id_tow"]}");
                        if (_recznie_wybrane)
                        {
                            if (_multi_ilosc > 0.0d)
                            {
                                suma_ilosci = Convert.ToDouble(drSPrzyj[0]["Suma_ilosc_towaru"]) + _multi_ilosc;
                                ilosc_wprowadzona = _multi_ilosc;
                            }
                            else
                            {
                                suma_ilosci = Convert.ToDouble(drSPrzyj[0]["Suma_ilosc_towaru"])+1.0d;
                                ilosc_wprowadzona = 1.0d;
                            }
                        }
                        else
                        {
                            if (_multi_ilosc > 0.0d)
                            {
                                suma_ilosci = Convert.ToDouble(drSPrzyj[0]["Suma_ilosc_towaru"]) + _multi_ilosc;
                            }
                            else
                            {
                                suma_ilosci = Convert.ToDouble(drSPrzyj[0]["Suma_ilosc_towaru"]) + 1.0d;
                            }
                        }
                        lp++;
                        _przyjete.Rows.Add(lp, drSel[0]["Id_dom1"], drSel[0]["Id_dom2"], _nr_dok, _idkth, _symbolKth, drSel[0]["Id_tow"], drSel[0]["Kod_1"], drSel[0]["Kod_2"], drSel[0]["Nazwa"], ilosc_wprowadzona, drSel[0][""], drSel[0]["Cena"], drSel[0]["Cena_spr_brutto"], drSel[0]["Lokalizacja"], _kodkr, suma_ilosci, _recznie_wybrane, _multi_ilosc, drSel[0]["Druk_specjal"]);
                        _przyjete.DefaultView.Sort = "Lp DESC";
                        _przyjete = _przyjete.DefaultView.ToTable();

                        //DRUK ETYKIETY
                    }
                    else
                    {
                        //dopracować bo może być kilka tych samych pozycji na dokumencie
                        StringBuilder sb = new StringBuilder();

                        foreach (DataRow dr in drSel) sb.AppendLine($"Kod_1: {dr["Kod_1"]}  | Nazwa: {dr["Nazwa"]}\r\n---------");

                        MessageBox.Show($"Ilość znaleziona: {drSel.Length}\r\n{sb}", "ISTNIEJE KILKA TOWARÓW O TYM KODZIE KRESKOWYM", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

                        StringBuilder sb1 = new StringBuilder();
                        foreach (DataRow dr in _towary.Rows) sb1.AppendLine($"Kod_1: {dr["Kod_1"]}  | Kod kreskowy: {dr["Kod_kreskowy"]}\r\n---------");
                        MessageBox.Show($"{sb1}");
                    }
                }
                else
                {
                    tb_ZnalezionyTowar.Text = $"Brak towaru o kodzie: {_kodkr}";
                    MessageBox.Show("Brak towaru o takim kodzie.\r\nWprowadź go ręcznie z listy.");
                }
            }
            else
            {
                //dorobić gdy robimy wybów z listy bo np. brak kodu lub nieczytelny
            }
            /*tb_KodKr.Select();
            MessageBox.Show($"{pt.ActiveControl.Name}");*/


        }

        public static Control Znajdz_aktywna_kontrolka(Control _kontrolka)
        {
            var kontener = _kontrolka as IContainerControl;
            while (kontener != null)
            {
                _kontrolka = kontener.ActiveControl;
                kontener = _kontrolka as IContainerControl;
            }
            return _kontrolka;
        }

        private void Dgv_Bilans_KeyPress(object sender, KeyPressEventArgs e)
        {
            char c = (char)e.KeyChar;
            
            if (c =='#')
            {
                licznik++;
                if (licznik == 2)
                {
                    string usunHasze = _barcode.Replace("#", "");  // usuwamy #
                    _barcode = "";
                    if (usunHasze.Length > 1)  // gdy odczytany kod 
                    {
                        //MessageBox.Show(usunHasze);                                                
                        lb_KKr.Text = $"Odczytany kod kreskowy:\r\n{usunHasze}";
                        Szukaj_towaru(usunHasze, dt_Towary, dt_Przyjete, 0, false, mf.nr_dok, mf.idKth, mf.symbolKth);
                        tb_KodKr.Select();  //dzieki temu wchodzi na tb - qrwa
                    }
                }
                else
                {
                    _barcode += c;
                }
            }
            else
            {
                _barcode += c;
            }

            if (c == (char)Keys.Return)
            {
                //dorobić entera
                _barcode = "";
            }
            
        }

        private void Tb_KodKr_TextChanged(object sender, EventArgs e)
        {
            if (kasuj_tb == false)
            {
                kasuj_tb = true;
                int licznik = tb_KodKr.Text.Split('#').Length - 1;    //liczymy ilość wystąpień #
                if (licznik == 2)
                {
                    string usunHasze = tb_KodKr.Text.Replace("#", "");  // usuwamy #
                    tb_KodKr.Clear();   // czyścimy naszego textboxa służącego do odczytu skanu
                    if (usunHasze.Length > 1)  // gdy odczytany kod 
                    {
                        //MessageBox.Show(usunHasze);
                        lb_KKr.Text = $"Odczytany kod kreskowy:\r\n{usunHasze}";
                        Szukaj_towaru(usunHasze, dt_Towary, dt_Przyjete, 0, false, mf.nr_dok, mf.idKth, mf.symbolKth);
                    }
                }
                kasuj_tb = false;

                //dorobić entera
            }
        }

        
    }

Na PrzyjmijTowar jest splitContainer1 (sc1).
sc1.Panel2 zawiera:

  • 2 etykiety
  • textboxa do którego ma wlatywać zeskanowany kod
  • groupboxa (gb)
  • texboxa w gb
  • plus dodane w przyszłości inne rzeczy

sc.Panel1 zawiera sc2. Ten z kolei zawiera:
sc2.Panel1:

  • groupboxa a on datagridview

sc2.Panel2:

  • groupboxa a on datagridview

Problemem jest to, że po wczytaniu kontrolki PrzyjmijTowar, focus nie ustawia się na textboxie do kodów kreskowych (nie ważne gdzie dawałem czy po initlialize czy w load). Co ciekawsze gdy zrobiłem obsługę klawiszy na górnym DGV, mogłem skanować kody. Dopóki w obsłudze klawiszy był tylko MessageBox za każdym zeskanowaniem kod był odczytany. Gdy dodałem funkcję, która na początku miała tylko MessageBoxa, po zeskanowaniu jednego kodu nie mogłem już więcej odczytać - focus był na sc1. Jak kliknąłem w textboxa to po zeskanowaniu kodu nie tracił focusu.
Niby udało mi się ustawić ten focus na texboxie ale w obsłudze klawiszy na DGV, ale to chyba mało eleganckie jest. No i przydało by się by ten focus był od razu na textboxie.
MessageBoxy były tylko po to by sprawdzić na szybko czy kody są skanowane poprawnie.
PS. Aż tak kiepsko napisałem pierwszego posta?

wyglad.png

SI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 110
0

Hej a dodaj timer na 100 i w nim oddaj focus na textbox.. czyli w zdarzeniu load dodaj timer1.enable i w timer1.tick wstaw textbox1.focus()

XR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 13
0

@sight Działa - dzięki, o czymś takim nie pomyślałem.

SI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 110
0

Oczywiście w zdarzeniu timer1.tick po textbox1.focus() wpis z timer1.enable = "false"

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.