Apr 162010
 

Sachen die immer mal wieder nützlich sein können.

1. Kalenderwoche eines Datum ermitteln.
private int KW(DateTime datum)
{
    CultureInfo cultureInfo = CultureInfo.CurrentCulture;
    int kw = cultureInfo.Calendar.GetWeekOfYear(datum, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    return kw;
}
2. Ein einfaches Event erstellen.
public event EventHandler<EventArgs> DeletePersonEvent;
public void DeletePerson()
{
	if(DeletePersonEvent != null)
	{
		DeletePersonEvent(this, new EventArgs());
	}
}
3. WPF Zeilenumbruch in einer Caption oder Text Tag.
<TextBox x:Name="myTextBox" Text="Linie 1 &#x0a; Linie 2" />

Zeilenumbruch mit: &#x0a;

4. DataTable über WCF

Das geht nicht. Man darf es zuerst noch in ein DataSet verpacken und dann über WCF übertragen.

public DataSet GetPersonenDataSet()
{
    DataSet ds = new DataSet();
    ds.Tables.Add(m_PersonDao.Read());

    return ds;
}

m_PersonDao.Read() gibt ein DataTable zurück.

5. WPF Datenbindung

Auch immer mal wieder etwas was ich suche, obwohl es eigentlich sehr einfach ist.

Wahrscheinlich gibt es etwa 1000 Möglichkeiten wie man es lösen kann. Ich mache es zur Zeit so.

Code-Behind vom XAML:

public RaumView(RaumModel model)
{
    InitializeComponent();

    this.m_Model = model;

    this.DataContext = m_Model;
}

In Zeile 7 binde ich eine Klasse, die meine Objekte enthält, an den DataContext.

Danach kann ich auf den Controls relativ einfach die Daten binden.

Text="{Binding Raum.Standort.Bezeichnung, Mode=OneWay}"

In diesem Text wird eigentlich m_Model.Raum.Standort.Bezeichnung angezeigt. Das Feld wird aber nicht zurück in den DataContext synchronisiert (Mode=OneWay). Wenn das der fall sein soll, dann macht man das so.

Text="{Binding Raum.Bezeichnung, Mode=TwoWay}"

Die Bezeichnung des Raumes wird jetzt in den DataContext zurück synchronisiert (Mode=”TwoWay”).

So in etwa reicht es für mich zur Zeit aus.

6. GUID im Debugger ändern

Hat man mal das Bedürfnis eine Variable zur Laufzeit zu ändern, die vom Typ GUID ist, kann man nicht einfach die neue GUID im Debugger reinschreiben.

So sieht es zur Laufzeit aus.

Original GUID

Einfach neue GUID zwischen die {} kopieren resultiert in einem Fehler.

Fehler

Lösung:

Richtig gemacht

new Guid(“<GUID>”)

So sieht es danach aus.

neue GUID

7. Irgend eine Datei öffnen

Ich will eine Datei öffnen ohne das ich das Programm kennen muss was für die Datei nötig ist. Das geht natürlich nur wenn ein Haendler für die Datei auf dem System registriert ist. Und wenn, dann ist es einfach.

Process myProcess = new Process();
myProcess.StartInfo.FileName = "<PFAD_ZUR_DATEI>";
myProcess.StartInfo.UseShellExecute = true;
myProcess.StartInfo.RedirectStandardOutput = false;
myProcess.Start();

Der FileName muss ein kompletter Pfad zu seiner Datei sein. z.B.: “c:\temp\MeinProgi\MeineDatei.txt

8. Eine E-Mail mit dem Standard E-Mail Programm öffnen.

Auch das kann mit der Process Klasse gemacht werden.

Process myProcess = new Process();
myProcess.StartInfo.FileName = string.Format("mailto:{0}", mailto);
myProcess.StartInfo.UseShellExecute = true;
myProcess.StartInfo.RedirectStandardOutput = false;
myProcess.Start();

Und schon öffnet sich eine E-Mail mit seinem Standard E-Mail Programm. Aber das geht nur wenn auf dem System ein mailto Haendler registriert ist. Aber sobald ein E-Mail Klient installiert ist ist das der Fall. Wenn kein mailto Haendler vorhanden ist kann eigenartiges Passieren. Bei uns auf einem Windows XP startete danach ein paar 100 Mal der Internet Explorer. Wie so er so oft startete ist mir nicht klar. Aber danach gab es eine Klickorgie bis alle IE’s geschlossen waren.

Der mailto Haendler ist unter HKEY_CLASSES_ROOT\mailto zu finden. Das heisst, es muss auch etwas in der Form HKEY_CLASSES_ROOT\mailto\shell\open\command mit einem Eintrag vorhanden sein.

So kann auch eine URL mit dem Standardbrowser geöffnet werden. Dann gibt man bei FileName nur die URL an. http://…

9. WCF Klassen und ihre Konstruktoren

Ich wollte bei der Initialisierung einer neuen Klasse einen Wert erzwingen. Der soll immer gesetzt werden. Dazu habe ich einfach den Konstruktor überladen, dass heisst, keinen leeren mehr angeboten.

Danach wollte der Host nicht mehr starten. Aber die Fehlermeldung gab keinen Hinweis darauf. Auch war in den Tracelogs vom WCF kein Hinweis zu finden. Per Zufall habe ich dann einen Haltepunkt geschickt gesetzt und dort den Hinweis bekommen das die Klasse Serie nicht serialisiert werden kann. Da machte es klick.

Man merke sich. Klassen die über WCF übertragen werden sollen MÜSSEN einen default Konstruktor haben ohne Überladung.

10. WPF Dantenbindung zwischen Controls Eigenschaften

Na ja, ob hier der Titel passt?! Schauen wir mal.

Ich komme immer mal wieder an die Situation das ich Controls einschalten oder ausschalten soll, und das anhand eines anderen Controls. Z.B. Wenn RadioButton IsChecked=true ist, dann bist du eingeblendet. Das geht mit WPF auch erstaunlich einfach.

IsEnabled="{Binding ElementName=optMamUnten, Path=IsChecked}"

Binding ElementName gibt an welches Control man nutzen will. Mit Path wird dann noch gesagt auf welches Property man achten will. Sobald das RadioButton mit dem Namen optMamUnten IsChecked=true ist wird das Control eingeschaltet. So einfach kann es sein.

Gibt dann einen ganz schönen und einfach umzusetzenden Effekt.

Checked 1

Checked 2

kick it on dotnet-kicks.de

  2 Responses to “C# Merkzettel”

Comments (2)
  1. Nett. Aber Tipp 1 ist buggy. Die Funktion gibt bei Culture deDE gerade beim Jahreswechsel nicht immer die korrekte Kalenderwoche aus.

    Gruß

  2. Aber so +- sollte es hinkommen. Oder?
    Gibts genaueres?

Sorry, the comment form is closed at this time.