Cześć wszystkim!
Czy jest możliwość aby poprzez wciśnięcie przycisku Tab na klawiaturze wywołać jakąś akcję?
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
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?
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.
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/
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
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?
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
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
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.
...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?
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.
...ale w takim razie wracam do początku bo niby jak ma działać ten Focus w przypadku wciśnięcia przycisku Tab?
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ć.
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?
...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.