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í.

Diskuze: Stlačenie buttonu klávesou enter

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Libor Šimo (libcosenior):17.9.2015 11:49

Ahoj,
viem, že to pracuje s

IsDefault="True"

ale ja mám v okne viac buttonov (v prílohe) a chcel by som, aby sa mi stlačil ten, pre ktorý som do textboxu vložil text.
Riešil už niekto podobný problém?

Odpovědět
17.9.2015 11:49
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Milan Křepelka
Tvůrce
Avatar
Milan Křepelka:17.9.2015 12:02

Šel bych na to z jiné strany. Při stisknutí tlačítka a na OnKeyCosi == Key.Enter spouštěl metodu která děla to samé.

Dosáhneš toho samého efektu a nemusíš se nimrat s nějakýma stavama na tlačítkách.

 
Nahoru Odpovědět
17.9.2015 12:02
Avatar
Odpovídá na Milan Křepelka
Libor Šimo (libcosenior):17.9.2015 12:26

Asi ti nerozumiem. Mám takýto kód na vyhľadávanie v listboxoch v jednom okne.

private void NajdiOsobaDhmButton_Click(object sender, RoutedEventArgs e)
{
    DhmOsobaListBox.SelectedIndex = skladnik.NajdiDhmVcm(NajdiOsobaDhmTextBox.Text);
    DhmOsobaListBox.ScrollIntoView(DhmOsobaListBox.SelectedItem);
    NajdiOsobaDhmTextBox.Text = "";
}

private void NajdiOsobaInvButton_Click(object sender, RoutedEventArgs e)
{
    DhmOsobaListBox.SelectedIndex = skladnik.NajdiDhmInv(NajdiOsobaInvTextBox.Text);
    DhmOsobaListBox.ScrollIntoView(DhmOsobaListBox.SelectedItem);
    NajdiOsobaInvTextBox.Text = "";
}

private void NajdiOsobaKhmButton_Click(object sender, RoutedEventArgs e)
{
    KhmOsobaListBox.SelectedIndex = skladnik.NajdiKhmVcm(NajdiOsobaKhmTextBox.Text);
    KhmOsobaListBox.ScrollIntoView(KhmOsobaListBox.SelectedItem);
    NajdiOsobaKhmTextBox.Text = "";
}

Mohol by si uviesť konkrétnejší príklad?

Nahoru Odpovědět
17.9.2015 12:26
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):17.9.2015 12:29

Takéto sú metódy:

public int NajdiDhmVcm(string vcm)
{
    int index = 0;
    var dotaz = from i in DhmZaznamy
                where (i.Vcm.StartsWith(vcm))
                select i;
    foreach (DhmZaznam zaznam in dotaz)
    {
        index = DhmZaznamy.IndexOf((DhmZaznam)zaznam);
    }
    return index;
}

public int NajdiDhmInv(string inv)
{
    int index = 0;
    var dotaz = from i in DhmZaznamy
                where (i.Inventurne.StartsWith(inv))
                select i;
    foreach (DhmZaznam zaznam in dotaz)
    {
        index = DhmZaznamy.IndexOf((DhmZaznam)zaznam);
    }
    return index;
}

public int NajdiKhmVcm(string vcm)
{
    int index = 0;
    var dotaz = from i in KhmZaznamy
                where (i.Vcm.StartsWith(vcm))
                select i;
    foreach (KhmZaznam zaznam in dotaz)
    {
        index = KhmZaznamy.IndexOf((KhmZaznam)zaznam);
    }
    return index;
}
Nahoru Odpovědět
17.9.2015 12:29
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):17.9.2015 12:33

A ešte príslušný xaml kód:

<Button Name="NajdiOsobaDhmButton" Content="Nájdi VČM DHM" Click="NajdiOsobaDhmButton_Click" />
<TextBox Name="NajdiOsobaDhmTextBox" Text="" Width="100" />
<Button Name="NajdiOsobaInvButton" Content="Nájdi inv.č." Click="NajdiOsobaInvButton_Click" />
<TextBox Name="NajdiOsobaInvTextBox" Text="" Width="100" />
<Button Name="NajdiOsobaKhmButton" Content="Nájdi VČM KHM" Click="NajdiOsobaKhmButton_Click" />
<TextBox Name="NajdiOsobaKhmTextBox" Text="" Width="100" />
Nahoru Odpovědět
17.9.2015 12:33
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Milan Křepelka
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
Milan Křepelka:17.9.2015 12:37

Ber to jenom orientačně. Je to pseudokód ze kterého si vem jenom ten nápad.

private void NajdiOsobaDhmButton_Click(object sender, RoutedEventArgs e)
{
    MojeSuperMetodaObsluhujiciRizeniVesmiruProOsobaDhm();
}

private void NajdiOsobaDhmTextBox_OnKeyDown(object sender, KeyPressDownArgs e)
{
 if(e.Key = Key.Enter)
        {
                MojeSuperMetodaObsluhujiciRizeniVesmiruProOsobaDhm();
        }
}
public void MojeSuperMetodaObsluhujiciRizeniVesmiruProOsobaDhm()
{
    DhmOsobaListBox.SelectedIndex = skladnik.NajdiDhmVcm(NajdiOsobaDhmTextBox.Text);
    DhmOsobaListBox.ScrollIntoView(DhmOsobaListBox.SelectedItem);
    NajdiOsobaDhmTextBox.Text = "";
}
 
Nahoru Odpovědět
17.9.2015 12:37
Avatar
Odpovídá na Milan Křepelka
Libor Šimo (libcosenior):17.9.2015 13:04

Stále tomu nerozumiem. Ak v xaml nenastavím button IsDefault="True", tak sa mi žiadne tlačítko nespustí klávesou enter a keď to nastavím všetkým trom, spustia sa mi všetky tlačítka naraz.
Myslím, že supermetóda mi nepomôže.
Asi mi môže pomocť len podmienka, či je v textboxe nejaký text.
Nejak takto, len neviem, či to bude fungovať v main.

private void NajdiOsobaDhmButton_Click(object sender, RoutedEventArgs e)
{
    if (NajdiOsobaDhmTextBox.Text.Length > 0)
    {
        DhmOsobaListBox.SelectedIndex = skladnik.NajdiDhmVcm(NajdiOsobaDhmTextBox.Text);
        DhmOsobaListBox.ScrollIntoView(DhmOsobaListBox.SelectedItem);
        NajdiOsobaDhmTextBox.Text = "";
    }
}
Nahoru Odpovědět
17.9.2015 13:04
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Milan Křepelka
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
Milan Křepelka:17.9.2015 13:22

No to, ale tu mluvíš furt o nějakejch tlačítkách a nečteš co je psáno

private void NajdiOsobaDhmTex­tBox_OnKeyDow­n(object sender, KeyPressDownArgs e)

 
Nahoru Odpovědět
17.9.2015 13:22
Avatar
Odpovídá na Milan Křepelka
Libor Šimo (libcosenior):17.9.2015 13:34

Konečne viem o čom píšeš, díky. :-)
Ak som to správne pochopil, tlačítka môžem úplne vynechať. Je to tak?

Nahoru Odpovědět
17.9.2015 13:34
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Milan Křepelka
Tvůrce
Avatar
Milan Křepelka:17.9.2015 15:05

Ne úplně. Dávej pozor. Ty chceš IsDefault="True" právě proto, že když zmáčkneš Enter na tlačítku pro Dhm, tak se ti spustí Akce pro vyhledávání Dhm. Apustí se akce tlačítka _Click. Ale zbytečně se soustřeďuješ na ten Enter na tom tlačítku protože potom v rámci formuláře můsíš manipulovat s vlastností IsDefault na různých tlačítkách.

Ty zavoláš stejnou metodu(MojeSu­perMetodaObslu­hujiciRizeniVes­miruProOsobaD­hm();) v NajdiOsobaDhmTex­tBox_OnKeyDow­n, tak i v NajdiOsobaDhmBut­ton_Click, která bude dělat to co má a dosáhl jsi téhož. Jenom jsi to zabalil do metody. Další výhoda tohoto řešení je tak, že kdyby formulář rozšiřoval třeba o Menu a dělal na to položku v menu to samé jako v NajdiOsobaDhmBut­ton_Click, tak zase tam zavoláš metodu MojeSuperMeto­daObsluhujici­RizeniVesmiru­ProOsobaDhm() a máš bez práce zase fu samou funkcionalitu.

Je možné že mi nerozumíš a já se nedivím. Stává se to. To si nikterak neber. Já taktéž se nemusím vyjadřovat moc dobře. Navíc jde o drobnost. Kdybysme si stále nerozumněli, pošlu ti nejakej projektík, kde to bude jasný.

 
Nahoru Odpovědět
17.9.2015 15:05
Avatar
vodslon
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
vodslon:17.9.2015 15:42

Ahoj já bych to řešil takto. Napíšu příklad... Máš textbox, který víš, že patří k button1
tažke můžeš dáš, do Textbo1.text change to, že najdeš prvek co se jmenuje button1 a uložíš si ho do proměné buttontemp...

a ted nad celým projektem čekáš na zmáčknutí klávesnice Enter, to když vznikne, tak se pustí metoda, která pustí metodu Click na tlačítku, které je uložené v temp.

Button _tempButton;

        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("první");
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("druhej");
        }

        private void textBox_TextChanged(object sender, TextChangedEventArgs e)
        {
           _tempButton = (Button)this.FindName("button");
        }

        private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
        {
            _tempButton = (Button)this.FindName("button1");
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            if(e.Key == Key.Enter)
            {
                ZafocujEnter();
            }
        }

        private void ZafocujEnter()
        {
            PerformClick(_tempButton);
        }

        public static void PerformClick(Button btn)
        {
            btn.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
        }
 
Nahoru Odpovědět
17.9.2015 15:42
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 11 zpráv z 11.