none
WPF DataGrid Spalte entschlüsseln RRS feed

  • Frage

  • Salü alle zusammen

    Ich habe ein WPF DataGrid mit Werten welche aus einer Datenbank kommen wie folgt angebunden:

    <DataGridTextColumn Header="KG-Eintrag" Binding="{Binding Key_Wert}"/>

    Nun sind die Werte in der Datenbank im Feld Key_Wert verschlüsselt und müssen zuerst entschlüsselt werden. Dazu gibt es in meinem C# die Funktion Entschlüsseln(String CryptString) welche den unverschlüsselten Wert zurück liefert.

    Kann ich die Datenbankanbindung im DataGrid so lösen, dass die Werte vor der Anbindung zuerst durch die Funktion gehen? Stelle mir das irgendwie so vor:

    <DataGridTextColumn Header="KG-Eintrag" Binding="{Binding Entschlüsseln(Key_Wert)}"/>

    Vielen lieben Dank für Hinweise welche zur Entschlüsselung führen.
    Gruss Sabrina

    Sonntag, 4. August 2013 20:11

Antworten

  • Die Konverter-Klasse muss nicht zwingend IValueConverter implementieren, sollte sie aber. Diese Schnittstelle enthält Baupläane für 2 Methoden. Coinvert und ConvertBack. Diese müssen die  Deklaration aufweisen, die die Shcnittstelle haben will. Das ganze kann man sich in C# etwas erleichtern. Kommentiere einfach mal beide Methoden aus, klicke auf "IValueConverter" und drücke Strg + Punkt. Nun wählst du "IValueConverter-Schnittstelle implementieren". Dadurch werden dir die Methoden richtig deklariert.
    Die NotImplementedException in ConvertBack tauschst du am besten gegen eine NotSupportedException aus (Wobei vielleciht auch der Verschlüsselungsalgorithmuss implementiert werden sollte?)
    In der Convert-Mathode baust du nun wieder deinen Code zum entschlüsseln ein. Dabei musst du beachten, das du ein Object bekommst, welches du erst in einen String wandeln musst. Am Ende solte die Klasse in etwa so aussehen:

        public class CryptToPlainConverter  :IValueConverter
        {
    
            #region IValueConverter Member
    
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                return GlobalCode.CryptToPlain(value.ToString()); //Liefert einen entschlüsselten String zurück
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotSupportedException();
            }
    
            #endregion
        }

    Nun erstellst du einmal das/die Projekt(mappe) (Strg ++ Umschalt + B). Dadurch machst du Visual Studio klar, das es jetzt eine neue Klasse gibt, die dann auch im XAML-Designer mit geladen wird.

    Nun fügst du einen XML-Namespace zum Fenster hinzu. Klicke dazu einfach an das Ende des Starttags <Window> und gebe xmlns:local="" ein. IntelliSense wird dir Dann alle möglichen Namespaces auflisten. Du wählst deinen aus der Liste aus und drückst Enter. IS erweitert dir die Angabe entsprechend. Nun sollte es auch mit dem erzeugen einer Resource klappen:

    <Window x:Class="WpfApplication184.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication184"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <local:CryptToPlainConverter x:Key="CryptToPlainConverter"/>
        </Window.Resources>
    Den Konverter bei der Bindung gibt man dann so an:
    Binding="{Binding Bericht_KGEintrag, Converter={StaticResource CryptToPlainConverter}}"
    PS: Die Convert und ConvertBack-Methoden nehmen einen Parameter (3. Parameter im Methodenkopf) an. Mit diesem kannst du den Konvertierungsvorgang anpassen. Angeben kannst du den Parameter so im XAML:
    Text="{Binding Text, ElementName=textBox, Converter={StaticResource CryptToPlainConverter}, ConverterParameter=1234}"





    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Mittwoch, 7. August 2013 14:37
    Moderator

Alle Antworten

  • Hallo, ja das geht mithilfe eines Converters. Dieser ist eine eigene Klasse, welche eine Convert und eine ConvertBack-Methode besitzt, mit deren Hilfe man Werte zwischen 2 Ansichten konvertieren kann. Ein Beispiel gibts in folgendem Link:
    http://wpftutorial.net/ValueConverters.html

    Vielleicht packst du die Entschlüsseln-Methode dafpür auch in eine Statische Klasse (VB.NET: Modul)


    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Sonntag, 4. August 2013 20:19
    Moderator
  • Guten Morgen lieber Koopakiller

    Mega vielen lieben Dank für den Link dessen Theorie ich total verstanden habe. Ich bin überzeugt, dass mich der ValueConvertror früher oder vermutlich doch eher später zum Ziel bringen wird.


    Ich habe also wie beschrieben eine Klasse gemacht, die habe ich folgendermasse geschrieben:

    Code01
    namespace ch.lkw.statistik
        public class CryptToPlainConverter : IValueConverter
        {
            public string ConvertCryptToPlain(string valueCrypt, Type targetType, object parameter)
            {
                return GlobalCode.CryptToPlain(valueCrypt); //Liefert einen entschlüsselten String zurück
            }
    
           // public string ConvertPlainToCrypt(string valuePlain, Type targetType, object parameter, CultureInfo culture)
           // {
           //     return GlobalCode.CryptToCrypt(valuePlain); //Liefert einen verschlüsselten String zurück
           // } 
        }
    }
    


    Weil ich nicht BoolToVisibility konvertiere, dachte ich, ich nenne das Teil CryptTiPlainConverter
    Ich habe CultureInfo culture entfernt, weil ich sonst folgenden Fehler bekomme:

    Fehler 1 "ch.lkw.statistik.CryptToPlainConverter" implementiert den Schnittstellenmember "System.Windows.Data.IValueConverter.Convert(object, System.Type, object, System.Globalization.CultureInfo)" nicht.

    Und dann habe ich den Teil ConvertPlaynToCrypt ganz entfernt, weil ich ja nur entschlüsseln will. Merke aber gerade, dass er ja nicht nur CultureInfo anmekert, sondern alle Parameter. Somit habe ich keinen Plan was hier falsch sein könnte.




    Dann habe ich die Dinge mit den Namespaces versucht:

    Code02
    <Window x:Class="ch.lkw.statistik.frmPatienten"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:l="clr-namespace:ch.lkw.statistik"
            Title="Patienten" Height="400" Width="958">
        <Window.Resources>
            <l:CtyptToPlainConverter x:Key="converter" />
        </Window.Resources>



    Ich weiss nicht, ob ich gescheit war, als ich dachte, ich passe die Namen auf meine Gegebenheit an.

    Jedenfalls sagt er:


    Fehler 1 Der CLR-Namespace wurde nicht definiert. Der CLR-Namespace-URI verweist auf den Namespace "ch.lkw.statistik", der nicht in der Assembly vorhanden ist.

    Code01 und Code02 habe ich beide in der Datei frmPatienten.xaml bez.frmPatientenxaml.cs geschrieben.



    Fehler 2 Der l:CryptToPlainConverter-Typ wurde nicht gefunden. Alle Assemblyverweise müssen vorhanden sein, und alle Assemblys, auf die verwiesen wird, müssen erstellt worden sein.



    Und als letztes versuche ich dann die Bindung anzupassen. Aber dass dies nicht geht, wenn er oben l:CtyptToPlainConverter nicht gefunden hat, das verstehe ich ja noch.

    <DataGridTextColumn Header="KG-Eintrag" Binding="{Binding Bericht_KGEintrag,Converter={x:Key=converter} }"/>

    Wo denkst Du, mache ich den Fehler?

    Viele liebe Grüsse
    Sabrina


    Mittwoch, 7. August 2013 08:39
  • Die Konverter-Klasse muss nicht zwingend IValueConverter implementieren, sollte sie aber. Diese Schnittstelle enthält Baupläane für 2 Methoden. Coinvert und ConvertBack. Diese müssen die  Deklaration aufweisen, die die Shcnittstelle haben will. Das ganze kann man sich in C# etwas erleichtern. Kommentiere einfach mal beide Methoden aus, klicke auf "IValueConverter" und drücke Strg + Punkt. Nun wählst du "IValueConverter-Schnittstelle implementieren". Dadurch werden dir die Methoden richtig deklariert.
    Die NotImplementedException in ConvertBack tauschst du am besten gegen eine NotSupportedException aus (Wobei vielleciht auch der Verschlüsselungsalgorithmuss implementiert werden sollte?)
    In der Convert-Mathode baust du nun wieder deinen Code zum entschlüsseln ein. Dabei musst du beachten, das du ein Object bekommst, welches du erst in einen String wandeln musst. Am Ende solte die Klasse in etwa so aussehen:

        public class CryptToPlainConverter  :IValueConverter
        {
    
            #region IValueConverter Member
    
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                return GlobalCode.CryptToPlain(value.ToString()); //Liefert einen entschlüsselten String zurück
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                throw new NotSupportedException();
            }
    
            #endregion
        }

    Nun erstellst du einmal das/die Projekt(mappe) (Strg ++ Umschalt + B). Dadurch machst du Visual Studio klar, das es jetzt eine neue Klasse gibt, die dann auch im XAML-Designer mit geladen wird.

    Nun fügst du einen XML-Namespace zum Fenster hinzu. Klicke dazu einfach an das Ende des Starttags <Window> und gebe xmlns:local="" ein. IntelliSense wird dir Dann alle möglichen Namespaces auflisten. Du wählst deinen aus der Liste aus und drückst Enter. IS erweitert dir die Angabe entsprechend. Nun sollte es auch mit dem erzeugen einer Resource klappen:

    <Window x:Class="WpfApplication184.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication184"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <local:CryptToPlainConverter x:Key="CryptToPlainConverter"/>
        </Window.Resources>
    Den Konverter bei der Bindung gibt man dann so an:
    Binding="{Binding Bericht_KGEintrag, Converter={StaticResource CryptToPlainConverter}}"
    PS: Die Convert und ConvertBack-Methoden nehmen einen Parameter (3. Parameter im Methodenkopf) an. Mit diesem kannst du den Konvertierungsvorgang anpassen. Angeben kannst du den Parameter so im XAML:
    Text="{Binding Text, ElementName=textBox, Converter={StaticResource CryptToPlainConverter}, ConverterParameter=1234}"





    <Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
    Webseite | Code Beispiele | Facebook | Twitter | Snippets   C# ↔ VB.NET Konverter
    Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.

    Mittwoch, 7. August 2013 14:37
    Moderator
  • Salü Koopakiller

    Wow, Du bist überwältigend. Du hast eine Art zu erklären, mit welcher man nicht nur sein Ziel erreicht, sondern links und rechts auch noch andere Dinge fast wie automatisch versteht. Vielen lieben Dank Dir dafür.

    Es ist ja eigentlich klar, dass ich die Methoden des Interface nicht umbenennen darf, frag mich nicht, wie ich auf diese Idee gekommen bin. Sorry...

    Und dass die Klasse nicht erstellt wird, solange das Interface falsch ist ist somit ja auch klar. Und wenn die Klasse nicht erstellt wird, der Namespace nicht existiert ist ebenso Folgefehler...

    Und zuguter Letzt der Aufruf, ja, jetzt geht er endlich. Also nicht dass Du glaubst es wäre für mich einfach gewesen, ich habe mehr als eine Stunde aufgewendet um Deine ausführliche Anleitung stückweise zu verstehen und zu integrieren. Aber dank Deiner guten Art hat sich das mehr als gelohnt.

    Ich danke Dir, dass Du mir mein Produkt zum Laufen gebracht hast. 

    Herzlichste Grüsse
    Sabrina
    Mittwoch, 7. August 2013 17:35