1.24.2018

c# Liste generischer Klassen mit unterschiedlichen Typen

Ziel: Eine Liste von generischen Klassen (class) mit unterschiedlichen Typen (also unterschiedlichen T).

Vorarbeiten:
Nicht generische abstrakte BaseClass und generische Ableitung:
    public abstract class ReportFilter
    {
        public string Description { get; set; }
        public Type Type { get; set; }
    }

    public class ReportFilter : ReportFilter
    {
        public T Value { get; set; }
    }
 
Liste mit zwei Einträgen:
 var reportFilters = new List()
            {
                new ReportFilter<string> {Description="Name",Type=typeof(string),Value="Test"},
                new ReportFilter<bool> {Description="IsAktiv",Type=typeof(bool),Value=true}
            };
Auslesen:
 foreach (var reportFilter in reportFilters)
            {
                var type = typeof(ReportFilter<>).MakeGenericType(reportFilter.Type);
                var aktFilter = Convert.ChangeType(reportFilter, type);
                var propertyInfo = type.GetProperty("Value");
                if (propertyInfo != null)
                {
                    var val = propertyInfo.GetValue(aktFilter, null);
                }
            }
 
Kopierbare Version der Code-Schnipsel:
public abstract class ReportFilter { public string Description { get; set; } public Type Type { get; set; } } public class ReportFilter : ReportFilter { public T Value { get; set; } }

var reportFilters = new List() { new ReportFilter {Description="Name",Type=typeof(string),Value="Test"}, new ReportFilter {Description="IsAktiv",Type=typeof(bool),Value=true} }; foreach (var reportFilter in reportFilters) { var type = typeof(ReportFilter<>).MakeGenericType(reportFilter.Type); var aktFilter = Convert.ChangeType(reportFilter, type); var propertyInfo = type.GetProperty("Value"); if (propertyInfo != null) { var val = propertyInfo.GetValue(aktFilter, null); } }

1.18.2018

ReportViewer - lokale Reports in z.B. WPF

Damit der Report-Viewer problemlos funktioniert müssen alle ReportViewer-DLLS dieselbe Version haben und lokal kopiert werden.
Wenn dann der Fehler "Report-Definiton fehlerhaft" auftritt, hilft es die DLL "Microsoft.ReportViewer.ProcessingObjectModel.dll" ins Projekt auf zu nehmen.
Siehe eine Anleitung hier.

10.26.2016

EF liefert falsche Werte aus View auf SQL-Server

Manchmal liefert das EF falsche Werte aus einer View, die sich auf dem SQL-Server befindet (eventuelle auch aus anderen DBs, keine Erfahrung).

Das Problem wird durch fehlende bzw. falsche Entitäts-Schlüssel verursacht. Wenn das EF keine PrimaryKeys erkennt - und manchmal erkennt es auch die vorhandenen Keys in einer View nicht - dann wird ein ComponentKey aus allen nicht nullable Properties gebildet. Und der ist sowohl inhaltlich beliebig falsch als das er auch zu falschen Daten führt.

Abhilfe schafft die manuelle Korrektur der Entitätschlüssel im EF-Diagramm.

Hier noch eine Möglichkeit, wenn die View eigentlich keinen Schlüssel bietet. Diese verwendet eine Zeilennummer als Key (isnull(ROW_NUMBER() OVER (ORDER BY xy),-1) as rId). Isnull ist notwendig, da sonst die Zeilennummer manchmal nullable ist.

Das Verhalten kann komplett vermieden werden, wenn man eine Stored Procedure zwischenschaltet. Diese erlaubt auch das Sortieren der Daten.

9.20.2016

Sicherer Filename

VB:


Imports System.IO

Namespace Helper

    Public Class FileNameHelper
        Public Shared Function GetSafeFilename(filename As String) As String
            Return String.Join("_", filename.Split(Path.GetInvalidFileNameChars()))
        End Function
    End Class
End NameSpace

c#

public string GetSafeFilename(string filename) 
{ 
return string.Join("_", filename.Split(Path.GetInvalidFileNameChars())); 
}

Kopierversionen:

Imports System.IO Namespace Helper Public Class FileNameHelper Public Shared Function GetSafeFilename(filename As String) As String Return String.Join("_", filename.Split(Path.GetInvalidFileNameChars())) End Function End Class End Namespace

public string GetSafeFilename(string filename) { return string.Join("_", filename.Split(Path.GetInvalidFileNameChars())); }

8.18.2016

VS kopieren der Build-Ergebnisse in bestimmten Ordner

Relativ zur Solution:
xcopy $(TargetDir)*.*  $(SolutionDir)..\dlls\ /y


Absolutes Ziel:
xcopy $(TargetDir)*.*  c:\dlls\ /y
 

5.24.2016

VS2013 meldet "EditorPackage does not load correctly"

Unter

%LOCALAPPDATA%\Microsoft\VisualStudio\12.0
das Verzeichnis ComponentModelCache löschen.

4.28.2016

WPF - Kultur in Bindings nutzen

Folgende Zeile muss in der App.cs im OnStartup ergänzt werden:
FrameworkElement.LanguageProperty.OverrideMetadata(typeof(FrameworkElement), new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

4.21.2016

IP-Adresse des Client in einem Web.API 2.x Controler ermitteln

Nach dem Einbinden von System.ServiceModel funktioniert folgender Code:


private string GetClientIp(HttpRequestMessage request = null)
       {
           request = request ?? this.Request;

           if (request.Properties.ContainsKey("MS_HttpContext"))
           {
               return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
           }
           else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
           {
               RemoteEndpointMessageProperty prop = (RemoteEndpointMessageProperty)this.Request.Properties[RemoteEndpointMessageProperty.Name];
               return prop.Address;
           }
           else if (HttpContext.Current != null)
           {
               return HttpContext.Current.Request.UserHostAddress;
           }
           else
           {
               return null;
           }
       }

1.14.2016

WPF Listbox mit bleibender Markierung

Auch wenn ein anderes Element den Focus bekommt, bleibt der Eintrag "aktiv" markiert.

Events als Behaviors / Events in MVVM

Für WPF:
Verweis auf Microsoft.XAML.Interactions notwendig
...
xmlns:i=http://schemas.microsoft.com/expression/2010/interactivity
...
<i:Interaction.Triggers>


<i:EventTrigger EventName="Loaded">


<i:InvokeCommandAction Command="{Binding LoadedCommand}" />


</i:EventTrigger>


</i:Interaction.Triggers>


Für WinPhone 8.1:
Verweis auf Behaviors SDK (XAML)
...
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"


xmlns:core="using:Microsoft.Xaml.Interactions.Core"
...
<interactivity:Interaction.Behaviors>


<core:EventTriggerBehavior EventName="Tapped">


<core:InvokeCommandAction Command="{Binding RufeNummerAnCommand, Mode=OneWay}"/>


</core:EventTriggerBehavior>


</interactivity:Interaction.Behaviors>

1.13.2016

Veröffentlichen von ASP.NET Web-API RESTService per FileCopy

Vorbereitung des Codes

  1. Im Projektmappenexplorer von VisualStudio das Webserver-Projekt rechtsklicken
  2. Neues "Custom"-Profil anlegen
  3. Publis method:"File System" wählen und Pfad angeben
  4. Assistent bis zu Ende benutzen
  5. Inhalt des Zielverzeichnisses auf den Server kopieren, auf dem der IIS läuft

Vorbereitung des IIS

Neue Website einrichten deren physikalischer Pfad auf das Verzeichnis verweist, in dem der Code auf dem Server liegt.

11.11.2015

Singelton in C#

#region Singleton
       private static xxx _instance;

       private xxx() { }

       public static xxx Instance
       {
           get
           {
               if (_instance == null)
               {
                   _instance = new xxx();
               }
               return _instance;
           }
       }
       #endregion

c#-Code zu lesbarem HTML

http://csharpindepth.com/CodeFormatterTool.aspx

Converter, die man (fast) immer braucht

Sichtbarkeit über Bool (unsichtbar):

public class Boolean2VisibleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is bool)
        {
            if ((bool)value)
                return Visibility.Visible;
        }
        return Visibility.Hidden;
    }

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

Sichtbarkeit über Bool (ausgeblendet):

public class Boolean2VisibleCollapsedConverter:IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is bool)
            {
                if ((bool)value)
                    return Visibility.Visible;
            }
            return Visibility.Collapsed;
        }

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

5.08.2012

Oldi but goldi: Active-X Registrierung per Kontextmenu

Folgenden Text in eine Textdatei einfügen:

REGEDIT4
' -------------------------------------------------------
' Erweiterung des Windows Explorer-Kontextmenüs um die
' Einträge "Registrieren" und "Deregistrieren" bei Aus-
' wahl von DLL- und OCX-Dateien.
' -------------------------------------------------------
' Explorer-Kontextmenüerweiterung für DLL-Dateien:
[HKEY_CLASSES_ROOT\.dll]
@="dllfile"
[HKEY_CLASSES_ROOT\dllfile]
@="DLL"
[HKEY_CLASSES_ROOT\dllfile\Shell\Registrieren\command]
@="REGSVR32 \"%1\""
[HKEY_CLASSES_ROOT\dllfile\Shell\Deregistrieren\command]
@="REGSVR32 /u \"%1\""
' Explorer-Kontextmenüerweiterung für OCX-Dateien:
[HKEY_CLASSES_ROOT\.ocx]
@="ocxfile"
[HKEY_CLASSES_ROOT\ocxfile]
@="OCX"
[HKEY_CLASSES_ROOT\ocxfile\Shell\Registrieren\command]
@="REGSVR32 \"%1\""
[HKEY_CLASSES_ROOT\ocxfile\Shell\Deregistrieren\command]
@="REGSVR32 /u \"%1\""
' -------------------------------------------------------


Datei als irgendwas.reg speichern, doppelklicken und Registrirung erweitern.

Ab da ist dann bei ActiveX-Dateien das Kontextmenu um Deregistrieren und Registriern erweitert.

Quelle: http://msdn.microsoft.com/de-de/library/bb979360.aspx

4.13.2012

ORACLE neu starten

1. Schau mal auf dem Datnbankserver in der Systemsteuerung unter Dienste, ob der Dienst "OracleService" gestartet ist, wobei Du durch den Namen der Oracle-Instanz ersetzen mußt. In Deinem Fall müßte (wenn ich es recht sehe) der Dienstname OracleServiceTest lauten. Sollte der Dienst nicht gestartet sein, starte ihn.




2. Öffne auf dem DB-Server eine DOS-Box. Setze die Umgebungsvariable ORACLE_SID auf den Namen der Datenbankinstanz und melde Dich dann als sysdba mit SQL*Plus an:



set ORACLE_SID= (Achtung: Auch hier wieder durch den Namen der Datenbankinstanz ersetzen!)

sqlplus / as sysdba



Danach setze mal folgende Abfrage in SQL*Plus ab:



SQL1.SELECT STATUS FROM v$instance;



Sollte hier irgendein anderer Status als "OPEN" zurückgegeben werden, ist die Datenbank nicht geöffnet. In diesem Fall würde ich die DB versuchen durchzustarten und zu öffnen:





SQL1.shutdown immediate;2.startup;

1.25.2012

Datum zu Kalenderwoche in VB.NET

Private Function StartDatumDerKW(ByVal Jahr As Integer, ByVal KW As Integer) As DateTime
' > der vierte Januar des gegebenen Jahres wird erst mal benötigt
Dim dteStartTag As New DateTime(Jahr, 1, 4)
' > hole den ersten Wochentag der ersten Woche
Dim intWochentag As Integer = ((Int(dteStartTag.DayOfWeek) + 6) Mod 7) + 1
' > die Kalenderwoche beginnt aber eventuell n Tage vorher
Dim dteErsterTag As DateTime = dteStartTag.AddDays(1 - intWochentag)
Return CDate(dteErsterTag.AddDays((KW - 1) * 7))
End Function

Kalenderwoche in Datum in ORACLE

SELECT
TRUNC(TO_DATE('2511[Jahr]', 'DDMMYYYY'), 'IYYY') + ([KW] - 1) * 7 AS date_from,
TRUNC(TO_DATE('2511[Jahr]', 'DDMMYYYY'), 'IYYY') + ([KW] - 1) * 7 + 6 AS date_to
FROM sys.dual;

11.02.2010

Splash-Screen-Problem in VB.Net

Problem: Ein Formular das nach einem Splash-Screen gezeigt werden soll und nicht das Hauptformular ist (z.B. Login) erhält nicht den Fokus.

Lösung:
private m_FormLoaded as boolean



Private Sub frmLogin_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    m_FormLoaded = True

    txtUserID.Text = String.Empty
End Sub

Private Sub txtUserID_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtUserID.GotFocus
'This hack ensures that the user id field receives focus.
'For some reason it appeared to have focus however was not responding until
'user clicked on the Form!

    If m_FormLoaded = False Then
        System.Windows.Forms.SendKeys.Send(ControlChars.Back)

        txtUserID.Text = String.Empty

    End If
End Sub
Quelle:
http://bytes.com/topic/visual-basic-net/answers/638041-application-startup-event-splash-login-screens