Laden...
Avatar #avatar-3386.gif
adeptus myCSharp.de - Member
Informatiker Berlin Dabei seit 21.07.2011 106 Beiträge
Benutzerbeschreibung

Forenbeiträge von adeptus Ingesamt 106 Beiträge

08.01.2014 - 11:55 Uhr

Hi,

ich habe mich inzwischen für das StimulSoft-Tool entschieden weil

  • deren Unterstützung von MatrixDruckern besser ist (da wird direkt nur Text und die entsprechenden ESC-Kodes für fett, kursiv, und co... geschickt). Damit nutzt der Drucker dann seine internen Schriften und keine Grafik was immens wichtig ist um die Geschwindigkeit von Hochleistungs-Matrixdruckern zu erhalten. Es auch möglich jeden beliebiegen ESC-Kode in den Report einzubetten.

  • deren Unterstützung von "Business Objekten" besser ist. Meine Reports greifen nie direkt auf die Datenbank sondern erhalten immer eine Liste von "Business Objekten" die von EF-Klassen abgeleitet sind. Die Struktur dieser Objekte (deren Eigenschaften) werden als Teil des Reports in einem DataDictionary gespeichert. Das ist wichtig, damit der Enduser seine Berichte designen kann und auf die Eigenschaften (Name, Vorname, Strasse, Ort, ...) zugreifen kann und sie beliebig auf dem Report zu plazieren.

Ohne diese beiden Aspekte (die ich zum Teil sehr gründlich mit DevExpress besprochen habe) wäre ich nicht zu StimulSoft gegangen, weil deren Support nicht mit dem von DevExpress zu vergleichen ist. Da ist DevExpress meilenweit besser...

Trotzdem bleibe ich jetzt bei StimulSoft und hoffe es nicht später zu bereuen... 😕

Gruß,
Pascal

15.11.2013 - 09:38 Uhr

Na da hake ich doch gleich ein... 🙂

Ich stehe auch gerade vor der Entscheidung welches Reporting-Tool ich verwenden soll. Meine Applikation nutzt schon stark die DevExpress-Komponenten für die Darstellung (und habe sehr gute Erfahrungen damit gemacht), so dass eine Entscheidung PRO DevExpress Sinn machen würde, aber ich hätte auch gerne "Argumente" um nicht "nur aus Praktikabilitätsgründen" seitens des Reportings in eine Sackgasse zu geraten...

Vielleicht sollte man die Frage auch erweitern:

Welches Reporting-Tool nutzt ihr in euren Anwendungen (also nicht nur DevExpress oder Telerik)?

Anforderungen:

  • Fließtextbriefe und Rechnungen
  • Listen mit geschachtelten "Bändern" (aber keine Tabellen)
  • Vom Anwender einfach zu bedienender Editor mit der Möglichkeit Datenfelder zu plazieren
  • Jeder Ausdruck sollte auch als PDF exportierbar sein.
  • Unterstützung von Matrix-Schnelldrucker (Ja sowas gibt's noch 😉 ) Obwohl das wohl eher eine Frage der Treiber ist...
  • Es soll immer direkt gedruckt werden, eine Preview deren Druck dann erst noch per Tastendruck erreicht wird, ist nicht gewünscht. Einfach in der GUI auf "PRINT" drucken und gut...

Ich weiß, dass es bereits ein paar Threads dazu gibt, doch die meisten sind älter und da Flohen diesen hier bereits reaktiviert hatte, dachte ich es sei die richtige Stelle für mein Post anstatt einen weiteren Thread zu eröffnen.

Bin gespannt auf Antworten! 🙂

Gruß,
Pascal

12.11.2013 - 12:04 Uhr

Zwei getrennte Solutions wollte ich ja eben verhindern, aber auf die Build-Configuration hätte ich wirklich kommen können... 😁

Danke! 👍

12.11.2013 - 10:51 Uhr

Hi,

unter VS 2010 habe ich eine C#-Solution die aus einer Hauptanwendung (EXE) und einer Assembly (DLL) besteht.

Der Kode der Assembly stellt ein Framework dar welches selten verändert wird aber von der Hauptanwendung verwendet wird. Deswegen hat VS auch die entsprechende Abhängigkeit festgestellt (unter "Project dependencies"). So weit, so gut.

Wenn ich jetzt über das Kontextmenü im Solution Explorer meine Hauptanwendung auswähle und "ReBuild" aufufe wird jedesmal auch sofort die Assembly kompiliert (obwohl sie unverändert ist) und deren Versionsnummer inkrementiert. Es kann durchaus vorkommen, dass ich ein "Rebuild" der Hauptanwendung anstoßen möchte, doch dabei würde ich gerne die Assembly in Ruhe lassen. Ich will sie halt nur verwenden, nicht immer gleich kompilieren.

Wenn ich natürlich Kode in der Assembly geändert habe, dann will ich selber ein Build der Assembly anstoßen (oder eben "Build Solution") wobei sich dabei auch die Versionsnummer der Assembly verändern soll.

Ich kann natürlich darauf achten, und die umsonst veränderte Versionsnummer der Assembly einfach nicht ins repository "committen" sondern "reverten", aber geht das nicht anders?

Ich hoffe ihr habt verstanden was ich meine... 😕

Gruß,
Pascal

07.09.2013 - 23:14 Uhr

Ich hab's!!!!!!!!

Mein Gott, habe ich viel gesucht aber nun klappt´s. 🙂 🙂

In der Resourcen-XAML in der DLL muss eine Kleinigkeit hinzugefügt werden:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:Helpers="clr-namespace:AdeptusFramework.Framework.Views.Helpers[B];assembly=AdeptusFramework[/B]">

    <Helpers:ListWindowRecordCountToStringConverter x:Key="listWindowRecordCountToStringConverter" />
...
</ResourceDictionary>

Ich weiss zwar nicht genau warum das nötig ist, denn eigentlich ist es doch (zumindest MIR) klar, dass die Typen in dieser Assembly vorhanden sind, da ja auch das Dictionary dort ist. Aber vielleicht kommt ja jemand auf die Idee die Dictionaries und die passenden Converter-Klassen in verschiedenen Assemblies zu speichern... 🤔

Na jedenfalls kann ich jetzt endlich schlafen gehen!!!

Danke an: implement a bindingconverter into a resourcedictionary

Gruß,
Pascal

07.09.2013 - 22:19 Uhr

Hi,

ich habe wirklich viel im I-Net geschaut, Anleitungen gelesen und auch das Forum durchsucht, verstehe aber trotzdem nicht was mir passiert und hoffe auf eure Hilfe... 😕

Ich habe eine etwas groß geratene Anwendung auseinandergenommen und einen Teil davon als eigenständige DLL (assembly) wieder zusammengesetzt (AdeptusFramework.DLL). Diese lässt sich einwandfrei übersetzen und bietet nun ein paar visuelle WPF-Klassen, Converter, Styles, ...

In der Rest-Anwendung habe ich die oben erwähnte neue Assembly referenziert und etliche Namespaces und using's angepasst. Auch dieses Projekt lässt sich inzwischen fehlerfrei übersetzen. Alle nun in die DLL verschobenen Typen werden von der Hauptanwendung gefunden.

Das Problem beginnt beim starten der Anwendung. Es kommt folgende Meldung:

Fehlermeldung:
Zeilennummer "5" und Zeilenposition "6" von "Der unbekannte Typ "{clr-namespace:AdeptusFramework.Framework.Views.Helpers}ListWindowRecordCountToStringConverter" kann nicht erstellt werden.".

Der besagte Converter befindet sich in der neuen DLL und wird in einer kleinen RessourceDictionary deklariert:


<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:Helpers="clr-namespace:AdeptusFramework.Framework.Views.Helpers">

    <Helpers:ListWindowRecordCountToStringConverter x:Key="listWindowRecordCountToStringConverter" />
...    
</ResourceDictionary>

Der Converter selber sieht so aus:


namespace AdeptusFramework.Framework.Views.Helpers
{

    public class ListWindowRecordCountToStringConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
          ...
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

In der App.xaml der Hauptanwendung steht folgendes:


<Application x:Class="RvWIN.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="Modules/Anwendung/Views/MainWindow.xaml">
    
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/AdeptusFramework;component/Framework/Views/GlobalStyles.xaml" />
                <ResourceDictionary Source="pack://application:,,,/AdeptusFramework;component/Framework/Views/Helpers/Converters.xaml" />

... hier noch andere Dictionaries aus der DLL ...

... hier jetzt die eigenen Dictionaries der Hauptanwendung ...

                <ResourceDictionary Source="Modules/Buchungen/Views/Helpers/Converters.xaml" />
...

            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
    
</Application>

Ich bin fest der Meinung, dass es daran liegt, dass die eingebundenen Ressourcen/Dictionaries der DLL "nicht richtig da" sind...

Die DLL liegt im gleichen BIN Verzeichnis wie auch die EXE, es wird auch nicht gemeldet, dass die DLL nicht gefunden wird. Wenn ich in der App.xaml das "pack://application:,,," weglasse erhalte ich auch eine Fehlermeldung:> Fehlermeldung:

"Die Ressource "adeptusframework;component/framework/views/helpers/converters.xaml" kann nicht gefunden werden." So wie ich das verstanden habe sollte die URI mit "pack..." eigentlich korrekt sein für den Anwendungsfall...

Wenn ich aus der App.Xaml die Zeile mit den Converters.xaml entferne startet die Anwendung, stolpert aber dann schnell über den fehlenden Converter...

Interessanterweise wird das erste Dictionary (GlobalStyles.XAML) problemlos eingelesen, doch dort sind nur Styles und Templates. Erst wenn zu den XAML-Strukturen auch C#-Klassen existieren (wie bei den Convertern) kommt die Meldung...

Hat jemand eine Idee dazu??? Muß ich bei der DLL irgendwas einstellen? Etwas beim Einbinden der DLL in die Hauptanwendung (References) berücksichtigen?

Vielen, vielen Dank für jeden Hinweis!

Gruß,
Pascal

Edit
Genau das Problem wird hier übrigens auch erfragt: Why can't I load an an external resource dictionary that contains type converters?. Da bei der Antwort auf die "Sichtbarkeit" des Converters hingewiesen wird, habe ich das nochmal überprüft. Die Klasse ist wie man oben im C#-Snippet sieht public...

29.08.2013 - 15:18 Uhr

Wow!

Na ersteinmal VIELEN DANK für die Mühe!! 👍 👍 👍

PERFEKT!

Vielen, vielen Dank!

Die Verwendung von WriteableBitmap was die Lösung! Und den GDI-Kram bin ich damit auch los! 🙂 👍

Grüße aus Berlin,
Pascal

28.08.2013 - 15:39 Uhr

Ok, so weit alles verstanden, danke für die Links... Ich will ja nicht nerven, sorry...

Trotzdem wird mein Bild nach der Umfärbung noch immer mit Hintergrund (also nicht transparent) dargestellt.

Ich vermute, dass es an der Rückumwandlung zu BitmapImage liegt. Ich muss das Ergebnis ja zurück an ein Image-Control schicken und verwende hierzu dessen "Source"-Eigenschaft welche ja eine ImageSource erwartet.

Die Frage lautet also nun: Wie kann ich eine Bitmap mit transparentem Hintergrund wieder als ImageSource zur Verfügung stellen ohne die Transparenz zu verlieren.

wie bereits beschrieben mache ich das bisher so:


        public static BitmapSource ToWpfBitmap(Bitmap bitmap)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                bitmap.Save(stream, ImageFormat.Bmp);

                stream.Position = 0;
                BitmapImage result = new BitmapImage();
                result.BeginInit();
                // According to MSDN, "The default OnDemand cache option retains access to the stream until the image is needed."
                // Force the bitmap to load right now so we can dispose the stream.
                result.CacheOption = BitmapCacheOption.OnLoad;
                result.StreamSource = stream;
                result.EndInit();
                result.Freeze();
                return result;
            }
        }

Auch die Verwendung von bitmap.Save(stream, ImageFormat.Png); hat nicht geholfen...

Ich bin ratlos...

Grüße,
Pascal

28.08.2013 - 13:07 Uhr

HI,

Bitmap.Clear()? Von welcher Klasse ist das eine Methode? Hab die nicht gefunden...

vielleicht kannst DU mir kurz mal erklären was es mit dem Alphawert auf sich hat? Ich weiss, dass das irgendwie was mit der Transparenz zu tun hat, aber was/wie genau?

Gruß,
Pascal

28.08.2013 - 12:16 Uhr

Ich hab's jetzt mit der LockBitmap-Klasse gemacht (CodeProject) habe aber noch immer das Problem, dass mein Hintergrund nicht mehr transparent ist.

Mein Kode zur Farbumwandlung (Vollweiss (255, 255, 255) soll durch eine andere Farbe ersetzt werden, RGB (255, 255, 252) soll transparent werden):


            LockBitmap objLockBitmap = new LockBitmap(objSourceImage);
            System.Drawing.Color objColorOfActualPixel;

            objLockBitmap.LockBits();

            for (int X = 0; X < objLockBitmap.Width; X++)
                for (int Y = 0; Y < objLockBitmap.Height; Y++)
                {
                    objColorOfActualPixel = objLockBitmap.GetPixel(X, Y);
                    if (objColorOfActualPixel == System.Drawing.Color.FromArgb(255, 255, 255))
                        objLockBitmap.SetPixel(X, Y, objNewColor);
                    else
                        if (objColorOfActualPixel == System.Drawing.Color.FromArgb(255, 255, 252))
                            objLockBitmap.SetPixel(X, Y, System.Drawing.Color.Transparent);
                }

            objLockBitmap.UnlockBits();

            return objSourceImage;

Die Bitmap mag ja die Transparenz-Informationen haben, doch irgendwie geht die beim Zurück transformieren zu einer BitmapImage verloren. Und die BitmapImage brauche ich doch um das Bild wieder einer Image-Komponente über die Eigenschaft "Source" zuzuweisen, oder?

Ideen?

28.08.2013 - 11:06 Uhr

Hi Herbivore,

danke für die Antwort! 👍

Zur Zeit verwende ich zum Farbwechsel folgende Routine (also nicht GetPixel, SetPixel):


        private Bitmap PixelRePaint(System.Drawing.Image SourceImage, System.Drawing.Color OldColor, System.Drawing.Color NewColor)
        {
            Bitmap NewBitmap = new Bitmap(SourceImage.Width, SourceImage.Height);
            ColorMap[] CMap = new ColorMap[1];

            CMap[0] = new ColorMap();
            CMap[0].OldColor = OldColor;
            CMap[0].NewColor = NewColor;

            ImageAttributes ImgAttr = new ImageAttributes();
            ImgAttr.SetRemapTable(CMap);

            using (Graphics G = Graphics.FromImage(NewBitmap))
            {
                G.DrawImage(SourceImage, new Rectangle(0, 0, SourceImage.Width, SourceImage.Height), 0, 0, SourceImage.Width, SourceImage.Height, GraphicsUnit.Pixel, ImgAttr);
            }

            return NewBitmap;
        }

Nutze also SetRemapTable. Das ist wahrscheinlich die Ursache für den schwarzen Hintergrund, richtig?

Ich versuch's mal mit Set-/GetPixel...

Gruß,
Pascal

28.08.2013 - 09:02 Uhr

Hallo,

ich versuche in einer PNG-Datei EINE bestimmte Farbe (also einen RGB-Kode) durch eine andere zu ersetzen (das Ganze für WPF unter .Net4).

Bis jetzt habe ich das über den Umweg gemacht, aus der PNG eine Bitmap zu erstellen dort die Farbe zu ersetzen und dann das neu entstandene Bild wieder einzusetzen. Dort dabei verliert das Bild seine Transparenz (logisch, denn Bitmaps unterstützen das ja nicht...). Ich habe daraufhin versucht mit Bitmap.MakeTransparent was zu erreichen, doch ohne Erfolg.

So mache ich das bisher:


            System.Windows.Controls.Image imgPlanungsModus = (System.Windows.Controls.Image)GetControl("imgPlanungsModus");

            if (imgPlanungsModus != null)
            {
                var objBitmap = new BitmapImage(new Uri("pack://application:,,/Images/Forms/Disposition/Pipette.png", UriKind.Absolute));

                Bitmap alt = BitmapConversion.ToWinFormsBitmap(objBitmap);
                Byte[] RGB = BitConverter.GetBytes((int)AktuelleReiseFarbe);

                Bitmap neu = PixelRePaint(alt, System.Drawing.Color.White, System.Drawing.Color.FromArgb(RGB[0], RGB[1], RGB[2]));

                //neu.MakeTransparent(neu.GetPixel(1, 1));   <---???

                BitmapImage bi = (BitmapImage)BitmapConversion.ToWpfBitmap(neu);

                // Set the image source.
                imgPlanungsModus.Source = bi;
             }

Dabei verwende ich folgende weitere Methoden


    public static class BitmapConversion
    {

        public static Bitmap ToWinFormsBitmap(BitmapSource bitmapsource)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                BitmapEncoder enc = new BmpBitmapEncoder();
                enc.Frames.Add(BitmapFrame.Create(bitmapsource));
                enc.Save(stream);

                using (var tempBitmap = new Bitmap(stream))
                {
                    // According to MSDN, one "must keep the stream open for the lifetime of the Bitmap."
                    // So we return a copy of the new bitmap, allowing us to dispose both the bitmap and the stream.
                    return new Bitmap(tempBitmap);
                }
            }
        }

        public static BitmapSource ToWpfBitmap(Bitmap bitmap)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                bitmap.Save(stream, ImageFormat.Bmp);

                stream.Position = 0;
                BitmapImage result = new BitmapImage();
                result.BeginInit();
                // According to MSDN, "The default OnDemand cache option retains access to the stream until the image is needed."
                // Force the bitmap to load right now so we can dispose the stream.
                result.CacheOption = BitmapCacheOption.OnLoad;
                result.StreamSource = stream;
                result.EndInit();
                result.Freeze();
                return result;
            }
        }

Wie gesagt, die Farbesetzung funktioniert einwandfrei, nur weiß ich nicht wie ich die verlorengegangene Transparenz wieder herstellen kann.

Oder mache ich das Ganze viel zu umständlich und es gibt einen direkten Weg OHNE Umstellung auf Bitmap?

Bin für jede Anredung dankbar! 😃

Grüße,
Pascal

13.03.2013 - 11:31 Uhr

Hi,

ich habe folgenden Style für meine Grids definiert:


 <Style x:Key="GridViewStyle" TargetType="dxg:TableView">
        <Setter Property="DataContext" Value="{Binding GridViewModel}"/>
        <Setter Property="AllowHorizontalScrollingVirtualization" Value="False"/>
        <Setter Property="AllowColumnFiltering" Value="True"/>
        <Setter Property="BestFitMode" Value="VisibleRows"/>
...

Dort befindet sich bereits eine Vorbelegung für den Namen des DataContextes. Diese ist eine Property aus meinem ViewModel. Zu 90% ist diese Property auch vorhanden. Bei den anderen 10% kann die Property einen anderen Namen haben. In diesen Fällen sieht der Kode der den Style auf einem Grid anwendet so aus:

<dxg:GridControl Name="grdBuchungen" Style="{StaticResource GridStyle}" DataContext="{Binding BuchungenViewModel}"/>

Ich weise also dem Grid erst den Style zu und überschreibe dann den DataContext.

Das funktioniert auch so weit, doch zur Laufzeit erhalte ich in diesen Fällen im Output-Fenster immer die Meldung, dass er die Eigenschaft GridViewModel nicht in meinem HauptViewModel findet (BindingExpression path error). Das stimmt ja auch, den "GridViewModel" gibt es diesen Fällen nicht sondern zb eben "BuchungenViewModel".

Kann ich das Erscheinen dieser Meldungen irgendwie verhindern? Sie stören zwar die Anwendung nicht, doch ich befürchte, dass ich mich so sehr daran gewöhne dass ich dann echte Binding-Fehler übersehe...

Oder muß ich einen speziellen Style erstellen, per "basedOn" auf "GridViewStyle" verweisen, nur die DataContext-Property und diesen Style dann dem Grid zuweisen?

Gruß,
Pascal

12.03.2013 - 16:27 Uhr

îch hab mich grad neulich mit
>
auseinandergesetzt.
Das scheint eine sehr ähnliche Idee zu sein wie Galasofts EventToCommands.
Nur ohne den Interaction-Namespace.
Und man kann halt Listen attachen.

Das ist in der Tat fast das Gleiche...

Schade nur dass, ich nun GalaSofts-Lösung eingesetzt habe und die eine solche Auflistung in Styles wohl nicht zulässt.

Wie gesagt nur in Styles habe ich das Problem. Wenn ich das direkt in jedem Control eintrage kann ich beliebig viele EventTrigger der Reihe nach angeben... Ist das nicht doch ein Hinweis auf ein Syntax-Problem meinerseits?

Gruß,
Pascal

12.03.2013 - 10:13 Uhr

Hi,

das dachte ich auch schon, aber dann kommt folgende Meldung:

"Type 'TriggerCollection' is not usable as an object element because it is not public or does not define a public parameterless constructor or a type converter."

Jemand noch einen Vorschlag?

Gruß,
Pascal

11.03.2013 - 10:39 Uhr

welchen Datentyp hat "i:Interaction.Triggers"?

Ich glaube System.Windows.Interactivity.TriggerCollection wenn ich's richtig herausgeforscht habe...

10.03.2013 - 19:02 Uhr

Hi,

ich versuche einen Style zu erstellen bei dem auch Interaction.Triggers vorgegeben werden:


    <Style x:Key="GridViewStyle" TargetType="dxg:TableView">
        <Setter Property="DataContext" Value="{Binding GridViewModel}"/>
        <Setter Property="AllowHorizontalScrollingVirtualization" Value="False"/>
        <Setter Property="AllowColumnFiltering" Value="True"/>
...
        <Setter Property="i:Interaction.Triggers">
            <Setter.Value>
                <i:EventTrigger EventName="RowDoubleClick" >
                    <MVVMLight:EventToCommand Command="{Binding GridDoubleClick}" PassEventArgsToCommand="True"/>
                </i:EventTrigger>
            </Setter.Value>
        </Setter>
    </Style>

Diese Beispiel funktioniert so weit, aber ich schaffe es nicht MEHRERE Einträge für die Property "i:Interaction.Triggers" zu hinterlegen...

So was hier geht nicht:


...
        <Setter Property="i:Interaction.Triggers">
            <Setter.Value>
                <i:EventTrigger EventName="RowDoubleClick" >
                    <MVVMLight:EventToCommand Command="{Binding GridDoubleClick}" PassEventArgsToCommand="True"/>
                </i:EventTrigger>
                <i:EventTrigger EventName="PreviewKeyDown" >
                    <MVVMLight:EventToCommand Command="{Binding KeyDown}" PassEventArgsToCommand="True"/>
                </i:EventTrigger>
            </Setter.Value>
        </Setter>

Irgendwie müsste ich ihm sagen, dass ich als value für den Setter eine Auflistung angeben will sonst meckert er, dass value nicht mehrfach gesetzt werden darf...

Lässt sich das irgendwie syntaktisch lösen?

Danke und Gruß,
Pascal

28.02.2013 - 14:23 Uhr

Die Konfliktlösung für die *.suo-Dateien ist aber nicht möglich. Und da dort auch noch aller möglicher anderer Krams gespeichert wird (offene Fenster, etc.) ist gibt es bei *.suo-Dateien so gut wie bei jedem Update Konflikte. Das ist total ranzig, wenn man *.suo-Dateien mit in die Versionsverwaltung aufnimmt.

Genau! Leider wusste ich eben nicht, dass die binär sind...

@FZelle: Klar ist sie eingecheckt, doch was nutzt es mir, dass ich inzwischen an die hundert verschiedene Version der SUO-Datei in meinem Repository habe wenn ich sie nicht vergleichn / mergen kann...

Das könnte helfen:

>

DANKE! Damit konnte ich wenigstens ein paar Sachen retten!!! 😮 😮

Gruß,
Pascal

28.02.2013 - 10:29 Uhr

Tja, ich hatte genauso gesucht aber ohne ".Net" dafür aber mit "vs 2010"... Und da kam der "Hanselman" nicht bei raus... Ist auch das einzige brauchbare Ergebnis...

Aber danke für den Link! 👍

Leider scheint die SUO-Datei binär zu sein... Wunderbar... 🙁 Wie soll ich da meine ganzen Tasks wieder aus dem Source-Control holen? 🤔

28.02.2013 - 09:34 Uhr

Hi,

der Titel sagt alles: Wo werden die "User Tasks" aus der Task List von Visual Studio 2010 gespeichert?

Meine ganzen "User Tasks" sind nämlich pötzlich weg und ich hoffe sie aus irgendeinem Backup wieder zurück zu holen. Ich hatte bereits versucht einen Task mit Test-Zeichenkette zu erstellen und habe dann den ganzen PC nach dieser Zeichenkette durchsuchen lassen, leider ohne Erfolg. Vielleicht wird der Text irgendwie kodiert oder so... Im Internet fand ich leider auch nichts...

Weiß jemand mehr?

Vielen Dank im Vorraus!

Gruß,
Pascal

06.12.2012 - 14:04 Uhr

Hi,

war ein Tag nicht auf Arbeit, sorry.

Vielen Dank dafür, dass Du meine Aufmerksamkeit auf die Parameter gelenkt hast. Bei deren Durchsicht fiel mir naämlich auf, dass die SourceColumn des Parameters "Original_ID_Termin" nicht auf "ID_Termin" gesetzt war sondern auf "ID". Jetzt wo es korrekt gesetzt ist und die SourceVersion auf "Original" steht funktioniert's auch.

Nochmal vielen Dank für den Hinweis!

Gruß,
Pascal

04.12.2012 - 13:46 Uhr

Hi,

dank für die Antwort!

Ja, die Parameter sind da.

Ich habe das UpdateCommand ja auch über den integrierten Query Builder erstellt. Der hat die Paramter erkannt und in die Paramters-Collection eingabaut.

Wenn ich das Command in dem QueryBuilder teste ("Execute Query") fragt er nach den Parametern und dann funktioniert das auch. Die Datenbank wird aktualisiert.

Also wird entweder das UpdateCommand nicht getriggert oder die Parameter werden falsch gesetzt. Kann ich denn so einfach "@Original_ID_Termin" verwenden oder brauche ich da was anderes? An sich wird die ID_Termin ja gar nicht geändert sondern nur die Spalte "Werbegebiet". Muß ich dann einfach "@ID_Termin" verwenden?

Gruß,
Pascal

04.12.2012 - 12:49 Uhr

verwendetes Datenbanksystem: SQL Server 2008

Hi,

ich habe ein DataSet in dem sich ein DataTable und ihr TableAdapter befinden. Die "GrundQuery" welche die Daten liefert (TableAdapter.SelectCommand) hat einen JOIN:


SELECT        R.ID, R.ID_Termin, R.RNr, R.TNr, T.Abfahrt, T.Werbegebiet
FROM            Ruecklaeufe AS R INNER JOIN
                         Termine AS T ON R.ID_Termin = T.ID
WHERE        (R.RNr = @RNr)

Dadurch war die IDE nicht in der Lage mir im TableAdapter die Eigenschaften UpdateCommand, DeleteCommand und InsertCommand automatisch mit SQL-Code zu füllen. Das ist ok.

Ich brauche hier nur das UpdateCommand und wollte es selber schreiben. Das habe ich so gemacht:


UPDATE       Termine
SET             Werbegebiet = @Werbegebiet
WHERE        (ID = @Original_ID_Termin)

Offensichtlich ist aber was falsche, denn beim Aufruf von TableAdapter.Update(Table) passiert nichts. Es kommt kein Fehler, die Methode liefert "0" zurück und die Datenbank bleibt unberührt.

Ich denke, dass an der Syntax meines UpdateCommand was faul ist.

Ich verstehe es doch richtig, dass

  • dieses UpdateCommand für jede geänderte Row aufgerufen wird, richtig?
  • die Parameter dann vom TableAdapter gefüllt werden?
  • das "@Werbegebiet" dann den aktuell in der Row gepufferten vom User geänderten Wert beinhaltet, während "@Original_ID_Termin" den unveränderten original Wert von ID_Termin beinhaltet?

Wenn obiges mit "Ja" beantwortet werden kann, verstehe ich nicht warum das Update "0" zurückliefert und die DB unberührt bleibt obwohl Daten in der DataTable geändert wurden.

Was könnte ich falsch machen, bzw. (falls ich grundlegend daneben liege) wie gehe ich besser mit "gejoined" Queries um die aber "updateable" sein sollen?

Vielen Dank für jeden Hinweis!

Gruß,
Pascal

06.11.2012 - 09:53 Uhr

Hi abt,

ja mag sein das die Designer schnell an ihre Grenzen stoßen, aber was wäre dann der richtige Weg OHNE Designer?

Gruß,
Pascal

06.11.2012 - 08:58 Uhr

Hi,

erstmal Danke für die Antwort!

Mein Problem ist, dass das DataSet als Datenquelle eines Grids (DevExpress) dient. Da habe ich leider keinen Einfluß auf den Zugriff, die Properties werden direkt angesprochen.

Da die DataSet Klassen "partial" sind könnte man natürlich für jede Spalte eine "nullable" Spalte im selbst geschriebenen Teil der Klasse erstellen, aber das kann's doch nicht sein, dass ich die Arbeit des Designers gleich nochmal mache und für jedes Spalte eine weitere Eigenschaft schreibe...

Gruß,
Pascal

06.11.2012 - 08:09 Uhr

Sorry, wenn ich das Thema "uppe", aber es brennt mir wirklich unter die Nägel...

Wie kann ich im Designer der Eigenschaft "NullValue" einer Nicht-String Spalte einen anderen Wert als "(Throw exception)" zuweisen?

Vielen Dank für euer Verständnis und eure Antworten! 👍

Gruß,
Pascal

05.11.2012 - 20:08 Uhr

Naja ich kann es im Designer schon einstellen. Aber folgendes Beispiel:

Ich habe in einer Oracle Datenbank ein Datumsfeld, welches nicht immer zwigend gefüllt werden muss/soll. Also sind manche Felder in der Datenbank "null".

Möchte ich das nun jetzt in VS umstellen und im Feld "NullValue" von "(Throw exeption)" auf "(Null)" ändern, bekomme ich die Meldung:

"Ungültige Eigenschaftswert - Der eingegebene Wert ist für den aktuellen Datentyp ungültig".

Das selbe gilt eben für Number (decimal) Felder. Nun die Frage, wie man soetwas umgehen kann. Weil die betreffenden Felder, welche in der OracleDB auf "null" sein drüfen in String-Felder im Designer ändern, ist auch nicht wirklich sinnig.

GENAU vor diesem Problem stehe ich gerade auch... Ich kann das NullValue nicht von "(Throw exeption)" auf "(Null)" umstellen wenn die Spalte nicht gerade ein String ist. AllowDBNull ist auf true und auch in der Datenbank (SQL-Server) steht das die Spalte NULL-Werte erlaubt.

Da der Link den MrBananenbrot in seinem letzten Eintrag angibt nicht mehr funktioniert wäre es toll wenn jemand mir da den richtigen Hinweis geben könnte.

Vielen, vielen Dank!

[Edit]
Habe inzwischen folgenden Link gefunden: Allow null values to be returned from strongly typed datasets. Das bezieht sich aber auf eine ältere Version von ADO. Aber es scheint, dass man direkt im XSD-File Werte ändern muß.

Ich habe daraufhin bei mir mal in mein XSD geschaut und folgendes darin gefunden:

<xs:element name="GutscheinNr" msprop:nullValue="_throw" msprop:Generator_ColumnPropNameInRow="GutscheinNr" msprop:Generator_ColumnVarNameInTable="columnGutscheinNr" msprop:Generator_ColumnPropNameInTable="GutscheinNrColumn" msprop:Generator_UserColumnName="GutscheinNr" type="xs:int" minOccurs="0" />

Ich denke mal ich muß an msprop:nullValue="_throw" was ändern. Bei String feldern kann man das ja direkt im Designer ohne das sich VS beschwert. In diesen Spalten steht dann: msprop:nullValue="_null". Kann ich das für meine int und datetime Spalten auch einfach so reinschreiben??

Oder habe ich einen Denkfehler, denn es scheint ja kaum jemand das Problem zu haben...

[/Edit]

05.11.2012 - 14:26 Uhr

Allerdings ist das schon fast die Holzhammermethode würd ich behaupten. Du könntest ja ebensogut nur das ContentTemplate des Buttons setzen, wodurch nur die Darstellung des Inhalts verändert wird, nicht aber die Funktionsweise.

Vielen Dank für Deine Antwort! Ich habe Deinen zweiten Vorschlag umsetzen können. 👍

Für Leute mit der gleichen Frage, hier das Ergebnis:


<Button Style = {staticresource ButtonStyle}>

<Style x:Key="ButtonStyle" TargetType="Button">
        <Setter Property="ContentTemplate" Value="{StaticResource ButtonTemplate}"/>
</Style>

<DataTemplate x:Key="ButtonTemplate" TargetType="Button" >
  <DockPanel>
    <Image DockPanel.Dock="Left" Source="pack://application:,,,/Images/Forms/Cancel_16x16.png" Width="16" Height="16"/>
    <TextBlock DockPanel.Dock="Right" Text="Abbrechen" Margin="10, 0, 0, 0" />
  </DockPanel>
</DataTemplate>

Gruß,
Pascal

05.11.2012 - 12:42 Uhr

Inzwischen habe ich festgestellt, dass das Binding wohl doch irgendwie funktioniert.

Meine Commands sind so definiert (absoluter Standard):


public DelegateCommand Command
{
  get { return cmdCommand; }
  set { cmdCommand = value; }
}

cmdCommand = new DelegateCommand(DoCommand, CanDoCommand);

public virtual Boolean CanDoCommand(object Param)
{
  return true;
}

public virtual void DoCommand(object Param)
{
  MessageBox.Show("TEST TEST");
}

Wenn ich die Funktion CanDoCommand FALSE zurückliefern lasse wird der Button gesperrt angezeigt. Wenn sie TRUE zurückliefert ist der Button frei. Also muß das Binding irgendwie noch vorhanden sein. Doch wenn ich den Button klicke passiert nix...

Wo ist der Korken???

Gruß,
Pascal

05.11.2012 - 12:34 Uhr

Button. HorizontalContentAlignment="Stretch" ?

DAS war's! Ich bin wohl deswegen nicht darauf gekommen, weil das auf einem nackten Fenster nicht angegeben werden muß. Dort ist HorizontalContentAlignment="Stretch" wohl ein Defaultwert weswegen automatisch dort das Grid das Fenster füllt...

VIELEN DANK! 👍

05.11.2012 - 12:22 Uhr

Hi,

einem Button kann ich ganz einfach ein Command zuweisen.


<Button Command={Bind VM.Command} ... />

Wenn mein Button nun durch ein Template definiert wird welches ich per Style zuweise


<Button Style = {staticresource ButtonStyle}>

<Style x:Key="ButtonStyle" TargetType="Button">
        <Setter Property="Template" Value="{StaticResource ButtonTemplate}"/>
</Style>

<ControlTemplate x:Key="ButtonTemplate" TargetType="Button" >
  <Button Width="120">
    <DockPanel>
      <Image DockPanel.Dock="Left" Source="pack://application:,,,/Images/Forms/Cancel_16x16.png" Width="16" Height="16"/>
       <TextBlock DockPanel.Dock="Right" Text="Abbrechen" Margin="10, 0, 0, 0" />
     </DockPanel>
   </Button>
</ControlTemplate>

dann funktioniert folgendes nicht mehr:


<Button Style = {staticresource ButtonStyle} Command = {Bind VM.Command} />

Das Command wird nicht mehr getriggert. Liegt es daran, dass das Template den Button komplett ersetzt und damit auch der Command verloren geht?

Wenn ich das Command im Template einfüge funktioniert's dann auch wieder, aber ich will ja nicht im Template schon fest ein Command binden. Das kann ja pro Knopf unterschiedlich sein, nur die Optik soll dank des Templates gleich bleiben...

Ideen?

Gruß,
Pascal

05.11.2012 - 12:03 Uhr

Ja, aber das löst nicht das Problem, dass das Grid nicht den Button füllt 😉

Könnte ich vielleicht alternativ dem Grid die Breite des Buttons geben in dem es eingebettet ist? <Width= Parentirgendwie.Width> ???

05.11.2012 - 11:10 Uhr

Das führt bei mir dazu, dass der Button RIESIG wird. Die Grafik wird auf das gefühlt hunderfachte gedehnt und auch der Text ist enorm groß ?!?!?!

Was will ich erreichen: Egal wie groß der Button ist soll die Bitmap immer links bleiben und 16x16 groß bleiben. Der Text soll den Platz rechts davon ausfüllen. Ist dort zu wenig Platz wird eben umgebrochen. So wie man das eben von Toolbar-Buttons zum Beispiel her kennt...

05.11.2012 - 09:42 Uhr

So, auch das DockPanel füllt den Button nicht aus. Egal ob mit <ContentControl> oder ohne...

@ErfinderDesRades: Du hast sowas ja wohl auch schon gemacht, oder? Füllen Deine Controls das Button aus? Ich könnte natürlich mit Margin arbeiten um einen vernünftigen Abstand zwischen Bitmap und Text auf dem Button zu bekommen, doch die Buttons können ja unterschiedlich groß sein bzw. sich in der Größe zur Laufzeit ändern. Dann sind die Margins u.U. plötzlich viel zu groß... 😕

[Edit]
Könnte ich vielleicht alternativ dem Grid die Breite des Buttons geben in dem es eingebettet ist?
[/Edit]

05.11.2012 - 09:30 Uhr

Meinst Du so?

                        <Button Command="{Binding GutscheineViewModel.GutscheinLoeschen}">
                            <ContentControl>
                                <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Aqua">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition />
                                        <ColumnDefinition />
                                    </Grid.ColumnDefinitions>
                                    <Image Grid.Column="0" Source="pack://application:,,,/Images/Forms/Drucken_16x16.png" Width="16" Height="16" HorizontalAlignment="Left"/>
                                    <TextBlock Grid.Column="1" Text="Löschen" Background="Black" HorizontalAlignment="Stretch" />
                                </Grid>
                            </ContentControl>
                        </Button>

Bringt leider das gleiche Resultat... Ich versuch's mal mit 'nem Dockpanel...

Gruß,
Pascal

03.11.2012 - 16:47 Uhr

Hi,

ich wollte mir ein Template für Buttons machen damit diese auch Images zeigen können.
Mein Template sieht folgendermaßen aus:

    <ControlTemplate x:Key="ImageButtonPrintTemplate" TargetType="Button" >
        <Button>
           <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <Image Grid.Column="0" Source="pack://application:,,,/Images/Forms/Drucken_16x16.png" Width="16" Height="16" HorizontalAlignment="Left"/>
                <TextBlock Grid.Column="1" Text="Drucken" HorizontalAlignment="Stretch" />
            </Grid>
        </Button>
    </ControlTemplate>

Mich wundert, dass das Grid nicht den kompletten verfügbaren Platz des Buttons nutzt. Das Grid wird im Button zusammengepresst dargestellt damit eben gerade noch das Bild und der Text zu sehen sind unabhängig davon wie groß das Button welches das Template nutzt tatsächlich ist. Wenn ich dem Grid eine bestimmte Width gebe sieht das dann besser aus, aber genau diese fest Zuordnung einer Größe will ich ja verhindern.

Das Grid soll sich dem Button dem es untergeordnet ist anpassen. Genau das klappt doch auch in einem Window. Wenn ich das Grid rauflege und keine Width/Height Angaben mache passt sich das Grid dem Formular an.

Warum klappt das nicht bei einem Button als Container/Besitzer des Grids?

Gruß,
Pascal

25.10.2012 - 16:55 Uhr

Ok, ich weiß jetzt warum das nicht geht.

Die Methode die letztlich FindName aufruft wird durch ein Binding getriggert. Es ist der getter der Property "DefaultControl" meines VMs welche ja widerum mit "FocusManager.FocusedElement" gebunden ist.

Offensichtlich wird dieses Binding getriggert BEVOR das Template geladen wird denn wenn ich die gleichen Zeilen in "OnApplyTemplate" hinein kopiere funktioniert FindName einwandfrei. Auch beim Debuggen geht er erst in den getter und dann später in OnApplyTemplate...

Kann das wirklich sein, dass "FocusManager.FocusedElement="{Binding DefaultControl}" zuschlägt bevor das Template richtig geladen ist??

25.10.2012 - 15:56 Uhr

... dann schau mal in
>
...

Danke für die Links. Genau das hatte ich auch versucht... Ich habe nun versucht es zu machen wie in dem obigen Link:

(Grid)myButton1.Template.FindName("grid", myButton1);

Bei mir also:

(IInputElement)wStandardWindow.Template.FindName(aControlName, wStandardWindow);

Aber es kommt immer null bei raus... 😦

So sieht das Window.xaml aus:


<Window x:Class="RvWIN.Framework.Views.StandardWindow"
...
        Height="300" Width="300" WindowStartupLocation="CenterScreen"
        Name="wStandardWindow"
        Title="{Binding WindowTitle}" 
        FocusManager.FocusedElement="{Binding DefaultControl}"
>
    <Grid>
    </Grid>
</Window>

Der Style der das Template auf das Fenster wirklen lässt:


    <Style x:Key="ListWindowStyleDX" TargetType="Window">
        <Setter Property="Template" Value="{StaticResource ListWindowTemplate}"/>
    </Style>

und das Template:


<ControlTemplate x:Key="ListWindowTemplate" TargetType="Window">
        <ControlTemplate.Resources>
...
        </ControlTemplate.Resources>
        <dxb:BarManager >
            <dxb:BarManager.Items>
...
            </dxb:BarManager.Items>
            <dxb:BarManager.Bars>
                <dxb:Bar Name="barMenu" Caption="" UseWholeRow="True" GlyphSize="Large" RotateWhenVertical="False" AllowHide="False" AllowQuickCustomization="False" AllowCustomizationMenu="False" BarItemHorzIndent="10"
                             ItemLinksSource="{Binding BarCommands}" ItemTemplateSelector="{StaticResource BarItemTemplateSelector}" >
                    <dxb:Bar.DockInfo>
                        <dxb:BarDockInfo ContainerType="Right"/>
                    </dxb:Bar.DockInfo>
                </dxb:Bar>
            </dxb:BarManager.Bars>
            <dxg:GridControl Name="grdRecords" ShowLoadingPanel="False" AllowMRUFilterList="True" IsFilterEnabled="True" Margin="0" ShowBorder="False" 
                                 ItemsSource="{Binding DataSource}" ColumnsSource="{Binding GridColumns}" >
...
            </dxg:GridControl>
        </dxb:BarManager>
    </ControlTemplate>

Das Grid hat den Namen "grdRecords" doch

(IInputElement)wStandardWindow.Template.FindName("grdRecords", wStandardWindow);

bringt immer null...

Muß ich irgendwie rekursiv durch die Controls des Templates durch? Denn das Grid ist ja nicht das oberste der Controls im Template...

Gruß,
Pascal

25.10.2012 - 14:57 Uhr

Alles klar, vielen Dank für die Antwort!

Da ich meine Controls alle per Style/Template auf dem Window bringe noch folgende Frage:

Funktioniert "FindName" dann auch um Controls zu finden die aus den Templates stammen?

25.10.2012 - 13:07 Uhr

HI,

ich würde gerne den Thread kurz reaktivieren ohne den Zustand "[erledigt]" gleich zu entfernen...

Und zwar möchte ich per Binding aus dem ViewModel heraus angeben, welches Control nach dem Laden des Windows den Focus erhalten soll. Klar kann man darüber streiten, ob das VM den Namen eines Controls aus der View kennen sollte oder nicht, aber ich sehe gerade keine andere Lösung:

Ich nutze also

<Window ... FocusManager.FocusedElement="{Binding DefaultControl}/>"

wobei "DefaultControl" eine Eigenschaft meines als DataContext dem Window übergebenen VM ist. Leider funktioniert das nicht wie es soll. Wenn ich statt "Binding..." direkt den Namen des Controls angeben funktioniert es.

Was könnte falsch sein? Welchen Typs muß DefaultControl sein? Zur Zeit ist im VM ein String der den Namen des Controls angibt.

Wie könne ich sonst das fokussierte Control angeben? Wenn ich's im COde-Behind mache, müsste ich doch für jedes Window eine eigene Window-Klasse erstellen die dann nur den Kode zum setzen des Focus hätte da der restliche Aufbau der Fenster bei mir aus Styles/Templates kommen.

Vielen Dank für Eure Antworten!

Gruß,
Pascal

22.10.2012 - 17:23 Uhr

Hi, danke für die Antwort...

Der Basiskonstruktor wird nämlich ohnehin bereits vor dem Konstruktor der erbenden Klasse ausgeführt.

Das eben wollte ich ja verhindern. Nach dem Motto: Laß ihn die Klasse erstellen mitsamt seiner Members, Properties und co. aber führe noch keinen Kode aus. Dann führe meinen Kode aus, dann mach weiter mit dem Kode in den geerbten Konstruktoren...

Aber ich dachte mir das schon nach meinen Recherchen, doch ich hoffte es gäbe doch einen Weg den ich blos nicht gefunden hätte...

Gruß,
Pascal

22.10.2012 - 17:03 Uhr

Hi,

wir kann ich auf einem Konstruktor heraus gezielt den Konstruktor der Vorgänger-Klasse aufrufen?

Damit meine ich anstatt von


public MeineAbleitung ()
            : base()
{
  InitialisiereEtwas ();
}

So was wie:


public MeineAbleitung ()
{
  InitialisiereEtwas ();

  base();
}

Ich möchte also erreichen, dass die Methode "InitialisiereEtwas" VOR dem geerbten Konstruktor aufgerufen wird weil in dieser Methode Settings gesetzt werden welche den geerbten Konstruktor beeinflussen.

Geht das überhaupt?

Gruß,
Pascal

18.10.2012 - 18:53 Uhr

Alles klar, vielen Dank!

Hätte MS ein wenig Ausländerfreundlicher programmieren können... 😉

18.10.2012 - 16:03 Uhr

Perfekte Antwort...

Ich hätte das um's Verrecken NIE herausgefunden! Vielen, vielen Dank! 👍

Es bleibt die Frage,

  1. warum diese Einstellung von der Culture des Threads abweicht und diese nicht einfach direkt verwendet

und

  1. wenn sie schon abweicht (gesondert vorgehalten wird) sie dann auf einem deutschen Betriebssystem nicht von sich aus auf de-DE gestellt ist...

Gruß,
Pascal

18.10.2012 - 14:35 Uhr

Hi,

ich verwende zur Anzeige eines Datumfeldes aus meinem Model per Binding folgenden XAML-Schnippsel:

<TextBlock Grid.Row ="0" Grid.Column ="3" Text="{Binding Model.ErstellungsDatum, StringFormat='{}{0:g}'}" VerticalAlignment="Center"/>

Zur Laufzeit wird das Datum aber leider in US-Amerikanischem Format ausgegeben.

In C# aber bringt folgender Kode das Datum brav in deutschem Format:

MessageBox.Show(String.Format("{0:g}", DateTime.Now));

Beide Male nutze ich den Format-Selektor "g". Laut Hilfe entspricht das den Selektoren "d" und "t". Wobei bei "d" steht: "lokalisierte Datumsangabe..."

Kann mir jemand erklären warum in XAML dann das englische Format erscheint?

Danke im Vorraus!

Pascal

10.10.2012 - 18:13 Uhr

Jein, nicht direkt, du könntest aber einen weiteren public Getter schreiben, der kein Feld in der Tabelle repräsentiert und somit auch nicht gemappt ist.

Ah ja, auch eine Idee...

Ich würde für so einen Sachverhalt aber immer ein ViewModel nutzen,

Ja, das stimmt, so was gehört ins ViewModel.

Für meine einzelnen Klassen/Objekte die ich zb in einem Fenster editiere, läuft auch alles über ein ViewModel.

In meinen Listen die das besagte Grid verwenden habe ich zwar auch ein ViewModel für die ganzen Funktionalitäten (Edit, Delete, ...) aber als Datenquelle für das Grid habe ich direkt die Liste aus dem EF durchgeschleift. Und dort erschien dann eben "T" und "F" weils so auch direkt aus der DB kam...

Wenn ich das jetzt "richtig" machen würde, müsste ich dann im ViewModel meiner Liste eine zweite Liste all meiner Objekte haben, die sich zwar aus der Liste im EF speist aber die Daten ggf. bereits angepasst hätte (und in meinem Fall aus dem String "T" den boolschen Wert true gemacht hätte)? Also quasi eine Dopplung der Daten??

Gruß,
Pascal

10.10.2012 - 17:40 Uhr

Addendum:
Ich habe das jetzt per Bit-Feld gelöst. Alles funktioniert jetzt... Echt doof, dass ich das mit den nchar(1) gemacht habe... 😜

@all: Danke für den Hinweis mit dem bit-feld. Und sorry, für die offensichtlich schlechte ursprüngliche Beschreibung meines Problems.

Trotzdem noch mal die allgemeine Frage: Gäbe es denn überhaupt einen Weg, den getter der Property eines EF-Feldes zu erweitern?

10.10.2012 - 17:25 Uhr

Warum sollte True False ankommen?

Das Feld im MSSQL Server heißt "bit, not Null". Im EF und analog C# wird daraus nen Boolean.

Das wusste ich nicht, dass das automatisch auf Bool umgesetzt wird, das ist natürlich die beste Lösung.

Es ist > mehr als schlecht <, wenn man auf die Idee kommt einen boolischen Wert als einfaches Zeichen in der Datenbank abzulegen; nur damit man irgendwelche "optische Standards" hat. ..[/url]

Mir ging's doch nicht darum " irgendwelche optische Standards" in der Datenbank zu erfüllen. Wir sind uns doch einig, dass das da nix zu suchen hat. Und das ich bei normalen Controls einfach mit hunderten Mitteln aus "T" ein "Ja" machen kann ist mir auch klar... Nur binde ich meine Daten an ein Grid von DevExpress und wollte dort in der Zelle eben nicht "T"/"F" sondern "Ja"/"Nein" sehen und suchte nach einem Weg das zu machen. Dabei dachte ich halt, ich könnte das EF erweitern.

Als ich die DB aufgebaut habe, dachte ich nur "T" und "F" sind genauso gut wie 1 und 0 wenn sowieso kein Boolean-Feld vorhanden ist. Ich hatte im I-Net gesucht und gelesen, dass viele es mit einem solchen nchar(1) machen. Jetzt weiss ich ja, dass ich mit einem bit-Feld das Problem lösen kann, denn die werden im Grid korrekt per Checkbox dargestellt.

Gruß,
Pascal

10.10.2012 - 15:26 Uhr

... das es dort doch einen bool gibt:
>
Punkt 7.

Na genau dort steht ja, dass es den Typ bool NICHT gibt... Es wird halt nahegelegt ihn durch den Typen "Bit" zu ersetzen. Aber eigentlich ist es ja egal ob nun nchar (1) oder bit (ausser vielleicht was Geschwindigkeit und Speicherverbrauch angeht). Fakt ist, dass eben nicht True/False ankommt.

Na gut, dann werde ich wohl weiter an der Oberfläche damit arbeiten die Werte zu "übersetzen".

10.10.2012 - 14:24 Uhr

verwendetes Datenbanksystem: SQL-Server 2008

Hi,

ich habe Zugriff auf meine Tabellen über Klassen des Entityframeworks erstellt. Das funktioniert auch einwandfrei.

Einer meiner Spalten ist eine "logische" Spalte. Da es keine "bool"-Spaltentyp gibt habe ich dafür eneb eine nchar(1) verwendet mit den Inhalten "T" oder "F".

Diese Spalte (bzw, die Property des entsprechenden EF-Objektes) ist zur Laufzeit mit einem Control verbunden und zeigt auch brav "F" oder "T". Nur leider möchte ich aber lieber die Worte "Ja" oder "Nein" an der Oberfläche sehen...

Wie kann ich das am Besten im EF machen? Den Getter der property kann ich ja nicht erweitern und Events wie beim Setter (Before..., after...) gibt es ja keine...

Ich stelle die Frage in diesem Teil des Forums weil ich das gerne im Rahmen des EF lösen möchte und nicht am Control durch Templates oder FormatStrings...

Jemand eine Idee?

Danke im Vorraus!
Pascal