C# DataGrid KeyDown() zmiana domyślnej wartości dla klawisza ENTER, override OnKeyDown

0

Cześć,

Mam problem z DataGrid a mianowicie klawisz ENTER domyślnie zatwierdza zmiany i przechodzi do kolejnego wiersza.
Chciałbym to zmienić. aby ENTER nie robił nic ale też nie blokował dalszych zdarzeń. Kod w KeyDown() wykonuje się już po przeskoczeniu do kolejnego wiersza.
Chciałbym rozwiązać problem bez użycia funkcji PreviewKeyDown().

Próbowałem nadpisać :


        public class NewOnKeyDown : DataGrid
        {
            /// <inheritdoc/>
            protected override void OnKeyDown(KeyEventArgs e)
            {
                if (e.Key == Key.Enter)
                {
                   
                    return;
                }

                base.OnKeyDown(e);
            }
        }

niestety bez skutecznie. Klasa Metoda jest wrzucona w pliku xaml.cs w klasie Window.

Kod z xaml:

DataGrid    Margin="0" x:Name="grid_wybierz_towar" ColumnWidth="*" CanUserReorderColumns="False" HorizontalGridLinesBrush="{x:Null}" VerticalGridLinesBrush="#FFD100FF" MouseDoubleClick="Grid_wybierz_towar_MouseDoubleClick" KeyDown="Grid_wybierz_towar_KeyDown" KeyUp="Grid_wybierz_towar_KeyUp" IsReadOnly="True"   

Chce się dowiedzieć czy powyższa klasa powinna działać oraz gdzie ją umieścić aby tak się stało.

0

Są 2 opcje: twoje akcje przed wykonaniem domyślnych akcji i/lub zablokowanie domyślnych akcji lub twoje akcje po domyślnych akcjach

0
Haisse napisał(a):

Cześć,

Mam problem z DataGrid a mianowicie klawisz ENTER domyślnie zatwierdza zmiany i przechodzi do kolejnego wiersza.
Chciałbym to zmienić. aby ENTER nie robił nic ale też nie blokował dalszych zdarzeń. Kod w KeyDown() wykonuje się już po przeskoczeniu do kolejnego wiersza.
Chciałbym rozwiązać problem bez użycia funkcji PreviewKeyDown().

Próbowałem nadpisać :


        public class NewOnKeyDown : DataGrid
        {
            /// <inheritdoc/>
            protected override void OnKeyDown(KeyEventArgs e)
            {
                if (e.Key == Key.Enter)
                {
                   
                    return;
                }

                base.OnKeyDown(e);
            }
        }

niestety bez skutecznie. Klasa Metoda jest wrzucona w pliku xaml.cs w klasie Window.

Chce się dowiedzieć czy powyższa klasa powinna działać oraz gdzie ją umieścić aby tak się stało.

Powiedzieć z takiego zdarzenia 'return' to powiedzieć 'czyń swoją powinność' czyli uruchomić następne handlery tego samego zdarzenia
Zobacz czy pomoże:

 e.Handled = true;

Ostatni raz takie coś robiłem w Swingu, więc nie mam pewności ;)
O dziwo, nie wszystkie zdarzenia mają tę property, ale klawiaturowe mają

0

Właśnie chciałbym się dowiedzieć jak to dokładnie działa. Kod wpisany w if zostanie wykonany przed domyślnymi akcjami , czy domyślne akcje zostaną zastąpione? I druga sprawa , wpisany tam kod nie wykonuje się. Na próbę jakiś messegebox był wpisany i komunikat nie wyświetla się . I czy e.handled = true nie zablokuje kolejnych zdarzeń KeyDown i KeyUp ?

Na ten moment wygląda to tak:

   public class Newkey : DataGrid
    {
        protected override void OnKeyDown(KeyEventArgs e)
        {
            
            if (e.Key == Key.Enter)
            {
                MessageBox.Show("dziala");

            }
            base.OnKeyDown(e);
        }
    }

    public partial class Window17_dodaj_towar_do_sprzedazy : Window
    {
         public Window17_dodaj_towar_do_sprzedazy()
        {
         InitializeComponent();
         }
  private void Grid_wybierz_towar_KeyDown(object sender, KeyEventArgs e)
        {
           
        }
    }

w xaml nie ma żadnego dopisku odnoście klasy Newkey

Jak pisałem wyżej , nie ważne co wpisze w ovverride , kod nie wykonuje się.

0
Haisse napisał(a):

... I czy e.handled = true nie zablokuje kolejnych zdarzeń KeyDown i KeyUp ?

Dałem zaledwie sugestię. Grzegorz widzi to inaczej.
Tym niemniej ustawienie na true oznaczało by, że "dla tego zdarzenia już dziękujemy" a nie odnosi się do żadnych następnych zdarzeń.

0

A wiecie może dlaczego ten kod się nie wykonuje? Próbowałem nadpisać OnKey w testowym projekcie na TextBoxie i też żadnego efektu.

public class Newkey : DataGrid
    {
        protected override void OnKeyDown(KeyEventArgs e)
        {

            if (e.Key == Key.Enter)
            {
                MessageBox.Show("dziala");

            }
            base.OnKeyDown(e);
        }
    }

    public partial class Window17_dodaj_towar_do_sprzedazy : Window
    {
         public Window17_dodaj_towar_do_sprzedazy()
        {
         InitializeComponent();
         }
  private void Grid_wybierz_towar_KeyDown(object sender, KeyEventArgs e)
        {

        }
    }

To co jest zawarte w protected override nie wykonuję się.

@update

Nadpisanie funkcji działa na TextBox , Window , w sumie większość rzeczy poza DataGrid, wygląda to tak:

public partial class Window17_dodaj_towar_do_sprzedazy : Window
    {
        public Window17_dodaj_towar_do_sprzedazy()
        {
            InitializeComponent();

        }
         
 protected override void OnKeyDown(KeyEventArgs e)
      
        {

            if (e.Key == Key.Enter)
            {
                MessageBox.Show("Działa");

            }
            base.OnKeyDown(e);
        }
}

natomiast nie wiem dlaczego w dalszym ciągu nie działa gdy wciśniemy enter a DataGrid ma focus.

2

To jest proste:

screenshot-20201013201355.png

1

Jeżeli chodzi o **DataGrid ** rzadko wykonujesz operacje na DataGridzie. Jest on tylko zbiorem kolekcji kolumn i wierszy, co idzie dalej za komórkami. Może bardziej wyceluj w style komórek i zdarzenia związane z nimi? Jeżeli to nie odpowiada możesz zbierać określone zdarzenia od wszystkich obiektów potomnych np:

<Button Keyboard.KeyDown="Button_KeyDownWithChild" KeyDown="Button_KeyDown">
            <Button.Content>
                <DatePickerTextBox x:Name="hPicker" KeyDown="PickerKeyDown">
                     
                </DatePickerTextBox>
            </Button.Content>
</Button>

KeyDown="Button_KeyDown" - Zdarzenie wywołane zostanie przy kliknięciu w przycisk (Jeżeli klikniesz w Picker znajdujący się wewnątrz nie zostanie wywołane)
KeyDown="PickerKeyDown" - Zdarzenie zostanie wywołane kiedy klikniesz w DatePicker znajdujący się wewnątrz przycisku
**Keyboard.KeyDown="Button_KeyDownWithChild" ** - Zdarzenie zostanie wywołane, kiedy kontrolka obsługująca zdarzenie lub jakiekolwiek jej "dziecko" uwolnią zdarzenie. Wtedy tylko musisz uważać, bo w parametrze "object sender" może być w sumie wszystko.

Edit. Nie kiedy klikniesz tylko kiedy wciśniesz przycisk na klawiaturze kiedy określona kontrolka ma focus

0

Wszystko zostało jasno wyjaśnione, dziękuje bardzo, temat do zamknięcia.

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