• Webseitenerstellung und -hosting
  • .NET Anwendungsentwicklung
  • softwaregesteuerte Prozessoptimierung
  • .NET

    Programmierung

  • WebseitenErstellung

    undHosting

  • softwaregesteuerte

    Prozessoptimierung

  • Konzeption

    und Beratung

solutionS Daily Grind - Blog
Artikel bewerten
(0 Stimmen)
Stand der Dinge: Ein Grid hat 2 flexible Spalten, die darin enthaltene Textbox soll 1 flexible Spalte ausfüllen und dabei ein Textwrapping verwenden. Problem: Textwrapping wird ignoriert, stattdessen wird die Spalte soweit vergrößert, dass der Text der Textbox "korrekt" dargestellt wird. Auswirkung: Ds Grid wird größer als die zugrundeliege Maske und übrige Spalten werden verschoben, evtl wird der Scrollviewer aktiviert. Lösung: Hinterlegung eines Root-Grids (Standard) und Festlegung der maximalen Größe des Sub-Grids auf die größe deas Root-Grids. via Xaml:
 MaxWidth="{Binding ElementName=grdRoot, Path=ActualWidth}"
	  
Artikel bewerten
(0 Stimmen)
Da solche Funktionen erst mit EF5 bzw. .NET 4.5 halbwegs vernünftig zur Verfügung stehen ("AsNoTracking") hier eine Möglichkeit um Entitäten zu klonen (als Extension :-))

;
Public Function Clone(Of t As EntityObject)(entity As t, ctx As oraEntities, Optional copyKeys As Boolean = True) As t
Try
Dim cloneE As t = ctx.CreateObject(Of t)()
Dim pis As PropertyInfo() = entity.GetType.GetProperties()

For Each pi As PropertyInfo In pis
Dim attrs As EdmScalarPropertyAttribute() = DirectCast(pi.GetCustomAttributes(GetType(EdmScalarPropertyAttribute), False), EdmScalarPropertyAttribute())

For Each attr As EdmScalarPropertyAttribute In attrs
If Not copyKeys AndAlso attr.EntityKeyProperty Then
Continue For
End If
'Strung und NULL abfangen, wird trotz Standardwert im SQL Server nicht imgesetzt
Dim objVal As Object
If pi.PropertyType = GetType(String) And pi.GetValue(entity, Nothing) Is Nothing Then
objVal = ""
Else
objVal = pi.GetValue(entity, Nothing)
End If
pi.SetValue(cloneE, objVal, Nothing)
Next
Next
Return cloneE
Catch ex As Exception
Throw ex
End Try
End Function


und zu vergleichen


;
Public Function Compare(Of t As EntityObject)(entityOriginal As t, entityCopy As t) As Boolean
Try
'Um Änderungen einer Entität festzustellen (t.equals funktioniert aufgrund der Abhängigkeiten mit anderen Tabellen nicht)
Dim pisOrig As PropertyInfo() = entityOriginal.GetType.GetProperties()

For Each piOrig As PropertyInfo In pisOrig
Dim attrs As EdmScalarPropertyAttribute() = DirectCast(piOrig.GetCustomAttributes(GetType(EdmScalarPropertyAttribute), False), EdmScalarPropertyAttribute())
If attrs.Count > 0 Then 'Fremdschlüsseltabellen ausschliessen
Dim objOrig As Object = If(GetType(t).GetProperty(piOrig.Name).GetValue(entityOriginal, Nothing) Is Nothing, "", GetType(t).GetProperty(piOrig.Name).GetValue(entityOriginal, Nothing))
Dim objCopy As Object = If(GetType(t).GetProperty(piOrig.Name).GetValue(entityCopy, Nothing) Is Nothing, "", GetType(t).GetProperty(piOrig.Name).GetValue(entityCopy, Nothing))
If Not objOrig.Equals(objCopy) Then
Return False
End If
End If
Next

Return True
Catch ex As Exception
Throw ex
End Try
End Function


Verknüfte Tabellen werden dabei allerdings nicht übernommen!	  
%AM, %04. %531 %2013 %11:%Jun

Docuware GAPI ClickOnce

Artikel bewerten
(0 Stimmen)
Docuware bietet auf seiner Homepage leider nur eine verinfachte Dokumentation. Entweder hat bisher niemand sein Tool welches die Docuware GAPI verwendet per Clickonce zu veröffentlichen oder ich mache etwas falsch. Da ich keine Fehler mache ergänze ich die Docuware Dokumentation für alle die evtl auf das gleiche problem stoßen. HIER beschreibt Docuware zwar wie man mit xcopy (!) in der Debug Umgebung in Visual Studio alles wunderbar zum laufen kriegt. Will man allerdings kein Setup genrieren da man die Vorteile der ClickOnce Bereitstellung nutzen möchte wird man erstmal mit Fehlermeldungen beworfen. Grund hierfür sind fehlende Dateien und das Mysterium, dass das Instanziieren eines neuen DWClients, anders als in der Debug Umgebung, sofort die Settings der settings.datei verwenden will, unabhängig davon, dass man die Einstellungen manuell im Code setzt dwClient = Gapi.Client.Gapi.newClient(False) 'Hier bereits Zugriff auf die Settings -> Fehler dwClient.Options.ASConnectionSettings.Clear() dwClient.Options.ASConnectionSettings.Add(Gapi.Client.Gapi.newConnectionSetting("noname", Stammdaten.docserver, Stammdaten.docport.ToInt, Stammdaten.docorganisation)) Lösung: manuelles hinzufügen benötgiter Dateien. Config und Settings Dateien müssen als externe Datei ins Projekt eingeschlossen werden, fehlende Referenzen als Verweis hinzugefügt werden.
%PM, %15. %669 %2013 %15:%Apr

WPF Datagrid Spalten ein- und ausblenden

Artikel bewerten
(0 Stimmen)
Leider besteht im WPF Datagrid keine Möglichkeit direkt auf Spalten zuzugreifen. Man kann natürlich durch die Eigenschaft "AutoGenerateColumns=True" und dem Ereignis "AutoGeneratingColumn" des Grid im Code Spalten anzeigen oder auch nicht. Was aber wenn man das ganze dynamisch gestalten will, am besten noch mit direkter Datenbindung und/oder seine Columns im Xaml definieren will? -> Fehlanzeige, da der Datacontext des Grids z.B. nicht an die DataGridTemplateColumn durchgereicht wird. Warum weiss der Geier. Abhilfe schafft folgendes Szenario von Thomas Levesque Leicht abgeändert und nach VB konvertiert. Zuerst braucht man einen Converter der boolsche Werte nach Visibility convertiert:

Public Class VisibilityConverter
Implements IValueConverter

Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.Convert
Try
If value Is Nothing OrElse CBool(value) = False Then Return Visibility.Collapsed

Return Visibility.Visible

Catch ex As Exception
Return Visibility.Collapsed
End Try

end class

End Function
dann eine Klasse die Freezable erbt und eine DependencyProperty "Data" bereitstellt.

Public Class BindingProxy
Inherits Freezable
'Freezable überschreiben
Protected Overrides Function CreateInstanceCore() As Freezable
Return New BindingProxy()
End Function

'Diesen Namen (Data) in der dataProperty und im XAML verwenden
Public Property Data() As Object
Get
Return DirectCast(GetValue(DataProperty), Object)
End Get
Set(value As Object)
SetValue(DataProperty, value)
End Set
End Property

'DependencyProperty für die "Data"
Public Shared ReadOnly DataProperty As DependencyProperty = DependencyProperty.Register("Data", GetType(Object), GetType(BindingProxy), New UIPropertyMetadata(Nothing))
End Class


In den PageResources bzw. Datagridresources diese beiden Klassen referenzieren:











dann die proxy klasse des Grids bestücken. Ich mach das via code


Dim p As BindingProxy = CType(grdElementeBearbeitung.Resources("proxy"), BindingProxy)
p.Data = CType(grdBereiche.SelectedItem, text_bereich)


und die Visiblity der Spalte an die Data Property bzw. das Feld binden


Visibility="{Binding Data.spalte_anzeigen,Converter={StaticResource VisibilityConverter},Source={StaticResource proxy}}"

	  
%AM, %15. %511 %2013 %11:%Mär

WPF ReportViewer Install on IIS Server

Artikel bewerten
(0 Stimmen)
das ReportViewer (SSRS) Steuerelement von MS kann man über eine Referenzierung auf Winforms in WPF nutzen. Allerdings gibt es ein Problem beim Veröffentlichen am IIS. Fehler:Die Anwendung kann weder installiert noch gestartet werden. Die Anwendung erfordert, dass die Assembly Microsoft.ReportViewer.ProcessingObjectModel Version 10.0.0.0 zuerst im globalen Assemblycache (GAC) installiert wird. Unable to install or run the application.  the application requires that assembly microsoft.reportviewer.processingobjectmodel version 9.0.0.0 be installed in the global assembly cache (GAC) first Allerdings bringt das etwas umständliche installieren der dll's im GAC des Servers keine Abhilfe. Trick ist, die dlls als erforderliche Komponenten in der WPF Anwendung direkt als "Einschliessen/erforderlich" zu kennzeichnen. Beim Veröffentlichen werden die DLL's dann ins Ausführungsverzeichnis der Anwendung kopiert.
%AM, %12. %499 %2013 %10:%Feb

MSCRM 4 Data Migration Manager

Artikel bewerten
(1 Stimme)
Fehler bei der Installation: "Der Pfad hat ein ungültiges Format" oder "The path is not of a legal form". Eine Lösung gibt es hier z.B. In der Registry folgenden Wert manuell setzen: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ Installer\UserData\S-1-5-18\Products\59DD8CB00184F24E99A62CF4D6109FA\InstallProperties\InstallLocation] jedoch muss man beachten: Der Key kann von System zu System variieren UND: der Fehler rührt nicht von einem ungültig eingetragem InstallationsPfad der Setup-Routine, sondern in einem fehlenden Eintrag der MS CRM Servers an sich. Man such nach DisplayName=Microsoft Dynamics CRM Server. Dort den korrekten Pfad zur Serverinstallation wählen (zB C:\Programme\Microsoft Dynamics CRM) und als Installationspfad für den DMM einen anderen wählen.
Artikel bewerten
(3 Stimmen)

oder auf Englisch: New transaction is not allowed because there are other threads running in the session. Szenario: In einer Schleife werden Objekte einer Tabelle verarbeitet und nach erfolreicher verarbeitung als "verarbeitet" markiert. Dabei schlägt der context.savechanges des Enityty Frameworks fehl. der Grund ist sowohl simple als auch, zumindest für mich, anfänglich nicht ganz verständlich, da ich eben an dieser Stelle speichern möchte. Die verwendete EF Connection behält die Änderungen des Objects bei und setzt diese auf "modified", so dass ein einmaliges savechanges genügt um alle Objekte zu speichern. Das Kuriose ist, dass es EF das nicht einmal zulässt, selbst wenn man die schlechtere Performance in Kauf nehmen wollte. Schuld ist die Schleife, die Objekte zur Laufzeit aus dem Context liest und so eine Änderung nicht zulässt...

 Using db as new EF_Context Dim jobs = From w In db.jobs Where Not w.verarbeitet.HasValue For Each job In jobs 'Verarbeitung If verarbeite_job(job) = true then 'abhaken job.verarbeitet = now 'db.savechanges 'SCHLÄGT FEHL!!! else 'loggen endif Next db.SaveChanges 'HIER ISSES RICHTIG End Using 

Seite 3 von 8