Ankündigung

Einklappen
Keine Ankündigung bisher.

[SOLVED] Mal was ganz anderes: C# WPF DataGrid und MouseDoubleClick

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [SOLVED] Mal was ganz anderes: C# WPF DataGrid und MouseDoubleClick

    Moin,

    Ich habe mal eine ganz andere Frage, die mit PHP nichts zu tun hat, daher auch im Offtopic.

    Warum hier?
    Im Forum, wo ich in C# Fällen sonst frage, erhalte ich seit einigen Monaten keine Antworten mehr auf meine Fragen.
    Und bevor ich mich in einem neuen Forum anmelde, dachte ich, ich frage mal hier, da ja hier auch einige .NET Entwickler unterwegs sind.

    Die Basis
    Ich habe eine WPF DataGrid, in der ich Spaltenfilter eingesetzt habe. Der Aufbau hier mal beispielhaft an der Kundenummer:
    Code:
                    <DataGridTemplateColumn HeaderStyle="{StaticResource ColumnFilterHeaderStyle}">
                        <DataGridTemplateColumn.Header>
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="*"/>
                                    <RowDefinition Height="*"/>
                                </Grid.RowDefinitions>
                                <Grid Grid.Row="0">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="*"/>
                                        <ColumnDefinition Width="Auto"/>
                                    </Grid.ColumnDefinitions>
                                    <TextBlock Grid.Column="0" Text="Kundennummer" Style="{StaticResource DataGridColumnHeader_TextBlock}"/>
                                    <Button Grid.Column="1" Style="{StaticResource DataGridColumnHeader_SortButton}"/>
                                </Grid>
                                <TextBox Grid.Row="1" Name="ColumnFilter_Account" Style="{StaticResource DataGridColumnHeader_TextBoxFilter}" KeyUp="EventHandler_FilterGrid" Tag="Account"/>
                            </Grid>
                        </DataGridTemplateColumn.Header>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Margin="5 2" Text="{Binding Path=Account}"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
    Wenn ich jetzt in den Spaltenfilter ( TextBox ) etwas eingebe und mit Enter abschließe, wird die Ansicht korrekt gefiltert.

    Das Problem
    Sobald eine Selection in der DataGrid aktiv ist, funktioniert das Filtern über Enter nicht mehr, sondern die Selection springt zur nächsten Row.
    An sich ein typisches Verhalten, allerdings bekomme ich das gerade nicht umgangen.

    Meine Versuche
    Hauptsächlich habe ich bisher versucht, die Selection von der DataGrid aufzuheben, bevor ich filtere. Hier mal zusammengefasst, welche Methoden, Eigenschaften ich dazu verwendet habe:
    Code:
    dgOrder.CancelEdit();                                   // um den Edit-Mode nach Doppelklick zu unterbrechen
    dgOrder.CommitEdit(DataGridEditingUnit.Cell, true);     // um das Verlassen des CellEditing Mode zu forcieren
    dgOrder.CommitEdit(DataGridEditingUnit.Row, true);      // um das Verlassen des RowEditing Mode zu forcieren
    dgOrder.SelectedItem = null;                            // um die Selection zu entfernen ( kein SelectedItems.Clear(), weil SelectionUnit="Row" )
    dgOrder.Items.Refresh();                                // Verzweiflungstat :-)
    Hat evtl. noch jemand eine Idee?
    Falls Infos fehlen, kurz reinrufen, reiche ich nach. Aber die relevanten Infos sollten da sein.

    Danke und Gruß
    Arne
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

  • #2
    Ich verstehe das Bild aber schon richtig oder? Du hast da ein Grid und die erste Zeile, die da noch irgendwie einen optischen Trenner unten hat, hat eine Zelle mit einem Textfeld. Wenn du da was reinschreibst und Enter drückst, dann soll gefiltert werden.

    Korrigiere mich, wenn ich da falsch liege, aber der Filtert doch schon, wenn ich einfach nur was in die Textbox eingebe, oder? Du nutzt da ja das KeyUp-Event. Müsste den Code von EventHandler_FilterGrid sehen, um das genau zu verstehen, aber das ist wahrscheinlich auch ein nicht so wesentliches Detail.

    Jedenfalls sollte es egal sein, ob etwas selektiert ist, oder nicht. Wenn du in einem Eingabe-Element bist, dann solltest du maximal noch sicherstellen, dass die Eingabe-Events nicht noch an die umschließenden Elemente weitergereicht werden. Im Event-Handler kannst du mit e.Handled = true; ggf. verhindern, dass sich das DataGrid auch noch mal im die gemachten Tasten-Anschläge kümmert.

    Aber jetzt alles aus dem Kopf. Kann sein, das ich da irgendwo was wesentliches übersehe.

    Kommentar


    • #3
      Hi,

      Danke für Deine Hinweise.
      Zitat von rkr
      Im Event-Handler kannst du mit e.Handled = true; ggf. verhindern, dass sich das DataGrid auch noch mal im die gemachten Tasten-Anschläge kümmert.
      Daran hatte ich tatsächlich noch nicht gedacht, hilft aber leider auch nicht, eben getestet.

      Zitat von rkr
      Ich verstehe das Bild aber schon richtig oder? Du hast da ein Grid und die erste Zeile, die da noch irgendwie einen optischen Trenner unten hat, hat eine Zelle mit einem Textfeld.
      Fast
      Ich habe mal ein Screenshot rangehängt, vielleicht sieht man es da besser. Die erste Row in der DataGrid ist die erste gelb hinterlegte Zeile.
      Die Filter-TextBox befindet sich im Header der Column.
      wpf-datagrid.png

      Zitat von rkr
      Korrigiere mich, wenn ich da falsch liege, aber der Filtert doch schon, wenn ich einfach nur was in die Textbox eingebe, oder? Du nutzt da ja das KeyUp-Event.
      Könnte man meinen, ich filtere aber erst, wenn Enter gedrückt wurde. Das KeyUp Event nutze ich, um mir die Möglichkeit freizuhalten, bestimmte Zeichen nicht zu erlauben.

      Aktuell springe ich bei jeder anderen Taste, wie Enter oder leerem Feld direkt raus:
      Code:
      TextBox source = (TextBox)sender;
      
      if (e.Key != Key.Enter || source.Text.Trim() == string.Empty)
          return;
      Zitat von rkr
      Aber jetzt alles aus dem Kopf. Kann sein, das ich da irgendwo was wesentliches übersehe.
      Sieht für mich nicht so aus, als hättest Du was übersehen, aber wer weiß das schon, ich scheine ja auch etwas wesentliches zu übersehen.

      Danke fürs Mitdenken!
      Falls Du noch Infos brauchst - sofern Du Dir weiter mit'n Kopp machen willst -, einfach melden.

      Gruß Arne
      Angehängte Dateien
      Competence-Center -> Enjoy the Informatrix
      PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

      Kommentar


      • #4
        Schau dir das mal an: https://stackoverflow.com/a/51663939

        Kommentar


        • #5
          Das liest sich, als wäre das die Lösung.
          Dann müsste ich aber ein CustomControl machen, wenn ich das richtig verstehe? Das bedeutet dann aber, dass alle EventHandler dahin umziehen müssen, weil es in einem anderen Namespace liegt.
          Muss ich mal schauen, ob ich mir das antun will.

          Danke für die Hilfe!
          Competence-Center -> Enjoy the Informatrix
          PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

          Kommentar


          • #6
            Zitat von Arne Drews Beitrag anzeigen
            Dann müsste ich aber ein CustomControl machen, wenn ich das richtig verstehe? Das bedeutet dann aber, dass alle EventHandler dahin umziehen müssen, weil es in einem anderen Namespace liegt.
            Glaube nicht.
            Wenn das Base-Control in einem anderen Namespace liegt, dann hat das zunächst mal keinen Impact auf die Event-Klassen von deinem Custom-Control. Außer du meinst jetzt was anderes.

            Kommentar


            • #7
              Ja, aber ich kann ja im XMAL dann nicht mehr
              Code:
              <DataGrid
              schreiben, sondern bspw.:
              Code:
              <my:CustomDataGridView
              , oder?

              Zumal das DataGridView eine WinForms Komponente ist und ich WPF verwende. Vermutlich würde das auch mit einer CustomDataGrid funktionieren, aber dann stehe ich wieder vor dem oben genannten Problem.
              Es sei dend, es gibt eine Möglichkeit dem DataGrid eine Custom-Basis anzuflanschen, da suche ich grad noch...
              Competence-Center -> Enjoy the Informatrix
              PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

              Kommentar


              • #8
                Ist gelöst, danke für eine Hinweise, so bin ich auf einen relativ einfachen Weg gekommen.

                Lösung
                Ich spendiere dem DataGrid zwei EventHandler:
                Code:
                PreviewKeyDown="EventHandler_SupressEnter"
                PreviewKeyUp="EventHandler_DisableEditingMode"
                Code:
                private void EventHandler_SupressEnter(object sender, KeyEventArgs e)
                {
                    if (e.Key == Key.Enter)
                        e.Handled = true;
                }
                
                private void EventHandler_DisableEditingMode(object sender, KeyEventArgs e)
                {
                    dgOrder.CancelEdit();
                }
                Beim PreviewKeyDown setze ich, wie Du schon gesagt hast das e.Handled = true, was verhindert, dass die nächste Zeile selektiert wird. Im PreviewKeyUp wäre es zu spät, da wäre die Selektion bereits gewandert.
                Im PreviewKeyUp beende ich dann einfach nur den durch den Doppelklick aktivierten CellEditing-Mode, weil sonst der Filter nicht verändert werden darf. Dies kann ich im PreviewKeyDown wiederum nicht machen, weil auch dann die Filterzuweisung wieder meckert, man befände sich noch im CellEditing-Mode.

                Klappt so aber prima und ist relativ schmal.
                Vielen Dank für die Anregungen!

                Gruß Arne
                Competence-Center -> Enjoy the Informatrix
                PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                Kommentar

                Lädt...
                X