Laden...

DataGrid validierung false => Editieren anderer Zellen nicht mehr möglich

Erstellt von Benni vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.581 Views
B
Benni Themenstarter:in
4 Beiträge seit 2012
vor 11 Jahren
DataGrid validierung false => Editieren anderer Zellen nicht mehr möglich

Hi,

ich lasse eine DataGrid (gebunden an eine DataTable) mit Hilfe einer Validation Rule auf Korrektheit überprüfen. Schlägt die Prüfung in einer Zeile fehl, kann ich nur noch diese eine Zeile editieren. Für meinen Anwendungsfall wäre es aber besser, wenn man weiterhin alle Zellen verändern könnte.

Ich habe dazu bereits in DataGrid: On cell validation error other row cells are uneditable/Readonly eine Lösung gefunden, leider habe ich keinerlei Unterschied gemerkt, als ich es in den Code eingefügt hatte.

Meine Fragen:

  1. Ist es möglich dieses Verhalten des DataGrids bei fehlschlagen der ValidationRules zu ändern.
  2. Geht es mit meiner gefundenen Lösung (wenn ja würde ich meinen Quellcode noch nachreichen)?

Für Anregungen, Links oä zu dem Thema würde ich mich freuen.
Vielen Dank.

Grüße, Benni.

C
2.121 Beiträge seit 2010
vor 11 Jahren

Umgeht das nicht den Sinn der Validierung?
Das was du möchtest wäre eine völlig freie Eingabe, bei der erst zu einem bestimmten Zeitpunkt alles auf einmal geprüft wird?
Da würd ich nicht extra eine Regel in der Automatik erstellen und die dann wieder außer Kraft setzen. Lass die Regeln doch einfach dann über alle Zeilen laufen wenn sie das auch wirklich soll.

B
Benni Themenstarter:in
4 Beiträge seit 2012
vor 11 Jahren

Mein Gedanke ist, dass wenn Fehler im DataGrid gefunden werden (va. wenn sie in verschiedenen Zeilen auftreten), dem Anwender selbst überlassen ist, wann er welchen Fehler zuerst behebt. Im aktuellen Fall ist es so, dass wenn in Zeile 1, 2 und 3 (bei zB drei Spalten) Fehler gefunden wurden und der Anwender den Fehler in Zeile 2 (Spalte 1) behebt, ist er gezwungen auch erst die restlichen Fehler in Zeile 2 zu beheben, bevor er alle anderen beheben kann.

Um es anschaulicher zu machen siehe Anhang. Der Benutzer kann Zeilen im DataGrid hinzufügen und löschen. Als Regeln habe ich aufgestellt:

  1. Alle Zellen müssen ausgefüllt sein.
  2. Sollzeit muss double-Wert sein, Senderadresse int-Wert

Wird gegen diese Regeln im DataGrid verstoßen wird das mit Hilfe des weißen Ausrufezeichens auf rotem Grund kenntlich gemacht.

Ich bin noch recht neu in diesem - meiner Meinung nach - seltsamen Vorgehen des DataBindings und DataValidation. Für Anregungen, wie ich es sinnvoller und eher gemäß des üblichen Sinnes gestalten kann, wäre ich sehr dankbar.

C
258 Beiträge seit 2011
vor 11 Jahren

Wenn der Benutzer die Daten von hand eingibt kannst du ebenfalls auf das CellEndEditing Event reagieren, dieses Blockiert nicht.

Jedoch kann ich damit den Fehler einfach ignorieren / was beim Validate nicht mödlich ist weil der Fokus solange auf dem Feld bleibt bis der Fehler behoben ist.

Du müsstest dich dann selbst dagegen absichern das die Fehler behoben werden bevor die Daten verwendet werden.

B
Benni Themenstarter:in
4 Beiträge seit 2012
vor 11 Jahren

Gut. Ich hab mich jetzt damit abgefunden, dass es so wohl nicht funktioniert, wie ich mir das vorstelle.

Ich hab es jetzt dahingehend geändert, dass die textbox für den Projektnamen mit einer ValidationRule dahingehend geprüft wird, ob der Anwender einen Namen eingetragen hat. Als zweites habe ich der DataTable für die Sollzeit-Spalte den Datentyp double zugewiesen. Somit verhält sich das Datagrid jetzt wie im Bild unten dargestellt.

Optisch habe ich die Fehleranzeige des Datagrids noch wie folgt abgeändert:

<DataGrid.Resources>
<Style x:Key="errorStyle" TargetType="{x:Type TextBox}">
  <Setter Property="Padding" Value="-2"/>
    <Style.Triggers>
      <Trigger Property="Validation.HasError" Value="True">
        <Setter Property="Background" Value="Red"/>
        <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
      </Trigger>
    </Style.Triggers>
</Style>
</DataGrid.Resources>
<DataGrid.RowValidationErrorTemplate>
<ControlTemplate>
  <Grid Margin="0,-2,0,-2" ToolTip="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}, Path=(Validation.Errors)[0].ErrorContent}">
    <Ellipse StrokeThickness="0" Fill="Red" Width="{TemplateBinding FontSize}" Height="{TemplateBinding FontSize}"/>
    <TextBlock Text="!" FontSize="{TemplateBinding FontSize}" FontWeight="Bold" Foreground="White" HorizontalAlignment="Center"/>
  </Grid>
</ControlTemplate>
</DataGrid.RowValidationErrorTemplate>

Wie im Bild unten zu erkennen, habe ich rechts oben noch einen Button der zur nächsten Seite führt. Dieser soll erst klickbar sein, wenn keine Fehler mehr angezeigt werden (analog soll sich der Minus-Button verhalten, wobei der nur deaktiviert sein soll, wenn im DataGrid ein Fehler ist).

Mein erster Versuch sieht so aus:


<Button.Resources>
  <Style TargetType="Button">
    <Setter Property="IsEnabled" Value="False"/>
      <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="{Binding ElementName=textBox_ProjektNamePage2aCreate, Path=Validation.HasError}"></Trigger>
      </Style.Triggers>
  </Style>
</Button.Resources>

Leider Funktioniert das nicht so wie ich mir das gedacht hatte. Wo liegt genau mein Fehler, bzw. ist das was ich vor habe nicht mit triggern möglich? Eine ähnliche Lösung hatte ich bereits, allerdings konnte ich da nicht abfragen, ob das Datagrid ein Fehler gemeldet hat.

Vielen Dank für die Hilfe

C
2.121 Beiträge seit 2010
vor 11 Jahren

Ich hab mich jetzt damit abgefunden, dass es so wohl nicht funktioniert, wie ich mir das vorstelle.

Anders formuliert, es funktioniert nicht mit einem Event, das für diesen Zweck nicht gedacht ist 😃
Anders könnte es aber schon funktionieren.

Ich weiß jetzt nicht wie altmodisch ich da denke, aber ich würde da mehr im Code ausprogrammieren, statt möglichst viele Events zu nutzen.
Dann kriegst du das Formular genau so hin wie du es haben willst. Schneller als jetzt und evtl. auch wartbarer.

Ich würde zum Beispiel beim Klick von Ok selber abprüfen ob in der Textbox was drin steht, statt eine Validierung zu nutzen die ich nicht beeinflussen kann. Dann kannst du eine Meldung bringen die dem Benutzer sagt warum es nicht weiter geht. Selbes für die Fehler im Grid.
Andernfalls kriegst du nur bald Beschwerden, warum der Button nicht endlich mal verfügbar wird.