Uruchomienie akcji po wciśnięciu przycisku Tab

0

Cześć wszystkim!
Czy jest możliwość aby poprzez wciśnięcie przycisku Tab na klawiaturze wywołać jakąś akcję?

1

Nie myślisz o zdarzeniach focusowych, jakiś Focus (GotFocus - pisze z głowy), LostFocus ?
Wszak dałeś tag WebForms.
Mało selektywne pytanie, mało użyteczna odpowiedź.

Zakładam rozumiesz, tab w przeglądarce jest przechwytywany przez jakiś rodzaj algorytmów javascriptowych, potem wtórnie przenoszony na serwer-side, na co się trzeba przygotować.

Takie coś google wystawił:
https://social.msdn.microsoft.com/Forums/en-US/7501afb5-a78e-49ea-86b2-ab5ddc3ecc53/aspnet-c-capture-lostfocus-event?forum=aspcsharp

0

Przepraszam jeśli moja odpowiedź była zbyt mało szczegółowa.

Chodzi mi o to by np "stojąc" w jednym textbox (który przed chwilą wypełniłem) i przyciskając Tab... wskaźnik wprowadzania tekstu przeskakiwał do innego textbox i go wypełniał tekstem z poprzedniego textbox. Samo wypełnienie textboxa treścią z wcześniejszego nie jest skomplikowane, ale jak wykonać by wciśnięcie Tab działało jak np OnClick?

0

Mam np taki oto skrypt:

        function copy()
        {
            var wartosc_TextBox1 = document.getElementById("<%=TextBox1.ClientID%>").value;
            var wartosc_TextBox2 = document.getElementById("<%=TextBox2.ClientID%>").value;
 
            document.getElementById("<%=TextBox3.ClientID %>").value = wartosc_TextBox1.charAt(0) + "." + wartosc_TextBox2;
    }

...i chciałbym aby wciśnięcie przycisku Tab na jakimkolwiek elemencie strony - ten skrypt (lub jakikolwiek inny podprogram) wywoływało.

1

Jeżeli nie musi to być tab to może wystarczy onFocus(), który kopiowałby wartość z ustawionego textbox'a? Jeżeli musi i będzie więcej przycisków do obsługi: https://keyjs.dev/

0
dlaFrajdy napisał(a):

Jeżeli nie musi to być tab to może wystarczy onFocus(), który kopiowałby wartość z ustawionego textbox'a? Jeżeli musi i będzie więcej przycisków do obsługi: https://keyjs.dev/

Powiedzmy wyraźnie: przemieszczamy rozwiązanie do JS (to nie krytyka, a stwierdzenie faktu). O ile nie ma wymagających związków z server-side, może być całkiem rozsądne

@eninede:
Komplikacja bardzo rośnie, że tą "akcję" chcesz wykonać na server-side.
Bo akcja na kliencie (w przeglądarce) to nie jest to samo, co akcja na serwerze

0

Tak, macie racje. Niepotrzebnie skomplikowałem.

Rozwiązałem problem dzięki javascript. To w ogóle wykonalne na server-side, bo i niby po co?

        document.addEventListener('keydown', function (event)
        {
            if (event.which === 9)
            {
                copy();
            }
        });

...a tak w ogóle to jest możliwe umieszczenie skryptu (np javascript) wewnątrz samej procedury c#, a nie odwoływanie się do niej na zewnątrz?

1

W części kontrolek jeżeli ustawisz jej stan w js'ie to server-side może tego stanu nie widzieć - taka pułapka.

Nie wiem, czy dobrze zrozumiałem pytanie: możesz umieścić i wywołać js z posiomu kodu, np. pokazanie okna modalnego w bootstrapie (tutaj akurat visual basic, ale działanie jest identyczne):

Protected Sub ShowModalPopup(modalId As String)
        Dim script = String.Format("$('#{0}').modal();", modalId)
        ScriptManager.RegisterStartupScript(Page, Page.GetType(), modalId, script, True)
    End Sub
0
eninede napisał(a):

Tak, macie racje. Niepotrzebnie skomplikowałem.

Rozwiązałem problem dzięki javascript. To w ogóle wykonalne na server-side, bo i niby po co?

Nooo to nie jest banalne. Do tej pory nie wiem, którego fw ASPX / której wersji fw używasz, a one jest w dużym stopniu frameworkiem serwerowym (a klient sie łączy nie wiem czym, może ajaxem)
W złośliwym scenariuszu można sobie strzelić w stopę.

        document.addEventListener('keydown', function (event)
        {
            if (event.which === 9)
            {
                copy();
            }
        });

...a tak w ogóle to jest możliwe umieszczenie skryptu (np javascript) wewnątrz samej procedury c#, a nie odwoływanie się do niej na zewnątrz?

Bez urazy, ale ostatnie zdanie świadczy, jak nie jesteś z tym oswojony (mówiąc grzecznie)

A co do samego JS, dla mnie o wiele czystszym sposobem jest napisanie zagadnienia wprost. jeśli Focus, to piszemy Focus, a nie key listener. On (key liestner) ci np złapie w jakiś brzydkich sytuacjach, np tab klepnięty w polu memo.

Tu masz dokumentację czystych operacji focusowych
https://developer.mozilla.org/en-US/docs/Web/API/Element/focus_event

1

Co masz na myśli pisząc "czystszym sposobem"? Czy "tab klepnięty w polu memo" nie będzie przypadkiem możliwy dopiero wtedy gdy na to pozwolę? — eninede 29 minut temu

Sam mówisz o opuszczeniu pola, więc dlaczego piszesz o śledzeniu klawiatury?
Mówimy "opuszczenie pola" to piszmy "opuszczenie pola".

Tak w ogóle powtórzę, podobną rzecz podkreślił @dlaFrajdy : poruszasz się w środowisku serwerowym z subtelnymi synchronizacjami (w tym ich brakiem) na stronę client side. Im bardziej będziesz brykał, tym większa szansa na coś złego.

W zupełnie innym środowisku webowym który uprawiam (mniej więcej podobnej złożoności *) ) wypełnienie pola na kliencie, bez synchronizacji z backing-fieldem na serwerze, klikniecie "zapis" da zapis do bazy tego, co wie serwer, a nie tego, co wyżebrane na kliencie

*) Ciągle się nie dowiedzieliśmy czego naprawdę używasz.

0

...a mam takie pytanie.

Czy jesli zechcę napisać program (nie web forms), ale już w win forms lub wpf to czy ten program (c#) będzie "mógł potrafić" czytać/interpretować skrypty javascript jak to potrafi web app - asp net wskazując na ten skrypt w procedurze?

0

Skryptów js nie, ponieważ tam js nie ma, ale eventy typu kliknięcie przycisku, focus itd. obsłużysz bez kombinacji takie jak w web forms.

0

...ale w takim razie wracam do początku bo niby jak ma działać ten Focus w przypadku wciśnięcia przycisku Tab?

0

Wyszukaj frazę "winforms textbox focus" i poczytaj kod z wyników z 1-2 stron z google. Na pewno się rozjaśni. O tym, jak "złapać" wciśnięcie przycisku Dowiesz się pod frazą "winforms detect tab". Trudno Ci pomóc nie do końca siedząc co chcesz zrobić i nie widząc żadnego kodu. Jeżeli nie miałeś styczności z winforms zrób jakiś mini kurs lub zobacz np. turorial tworzenia aplikacji podobnej do tej, którą Ty chcesz stworzyć.

0

Nie jestem pewien czy dobrze rozumiem, ale z tego co przeczytałem to "wywołanie" Focus na jakiś element może wynikać z jakiejs akcji np wcisnięcie buttonu, ale samo zaistnienie Focusu nie może wywoływać jakiejś akcji, tak jak np OnClick. Czy tak? A o to mi właśnie chodzi, że aby nie ważne czy kursor znalazł się w jakimś TextBox1 czy TextBox2 (lub innych) poprzez naciśnięcie clickiem czy tabulatorem to, żeby wykonywała się jakaś procedura? Czy tak się da... że jeśli wskaźnik znajdzie się w jakimkolwiek (lub kilku konkretnych) polu tekstowym to żeby wywoływała się konkretna procedura?

Ponadto do detekcji Tab znalazłem coś takiego:

        private void TextBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyData == Keys.Tab)
            {
                Label1.Text = "Tab";
                e.IsInputKey = true;
            }
            if (e.KeyData == (Keys.Tab | Keys.Shift))
            {
                Label1.Text = "Shift + Tab";
                e.IsInputKey = true;
            }
        }

Możliwość skorzystania z tego wymuszona jest poprzez wprowadzenie using System.Windows.Forms. Wciśnięcie Tab nie zmienia jednak wartości w Label1

...a może to wszystko da się wykonać jakoś prościej?

idealnie (prawie ;) ) mój problem rozwiązują 2 skrypty js:

document.addEventListener('keydown', function (event)
        {
            if (event.which === 9)
            {
                copy();
            }
        });

gdzie:

        function copy()
        {
            var wartosc_TextBox1 = document.getElementById("<%=TextBox1.ClientID%>").value;
            var wartosc_TextBox2 = document.getElementById("<%=TextBox2.ClientID%>").value;
 
            document.getElementById("<%=TextBox3.ClientID %>").value = wartosc_TextBox1.charAt(0) + "." + wartosc_TextBox2;
        };

Czy możliwe jest utworzyć odpowiednik tylko w C# - web forms?

0

...a czy nie jest przypadkiem tak, że skoro to jest aplikacja web forms działająca jako server-side to "nie ma prawa" obsługiwać zdarzeń (stricte c#) dziejących się po stronie klienta w obrębie web forms (nie win forms) o ile nie użyje się javascript działającego po stronie klienta?

Widziałem, przykłady detekcji Tab, ale wszystkie one odnosiły się do winforms.

1 użytkowników online, w tym zalogowanych: 0, gości: 1