
		<rss version="2.0">
			<channel>
			<ttl>5</ttl>
				<title>ppedv Blog</title>
				<link>http://blog.ppedv.de</link>
				<description>update by ppedv ***** Team Blog</description>
				<lastbuildDate>Tue, 21 Apr 2026 00:13:55 GMT</lastbuildDate>

				<image>
				    <url>http://blogs.ppedv.de/images/logo2.gif</url>
				    <title>ppedv Blog</title>
				    <link>http://www.ppedv.de</link>
				</image>
	
		<item>
			<title>[Till Sch&#252;rmann] Appointment RecurrencePattern Start-, und Endzeiten richtig auslesen</title>
			<description>Ein häufiger Anwendungsfall für ein Outlook Addin ist das Verarbeiten von Terminen aus dem Kalender. Verwunderlich ist dabei, dass gerade die Start und Endzeiten der Termine Schwierigkeiten bereiten. Die Entscheidung ob das nun ein Bug oder Feature ist überlasse ich jedem selbst. Hat man die folgende Problematik auch erst mal erkannt, lässt sich das “Feature” ;) auch leicht austricksen.  Als Beispiel habe ich eine einfach FormRegion erstellt, die via Adjoining die IPM.Appointment Klasse erweitert. Auf die Form 2 DateTimePicker, einen Button und eine ListBox. Über die DateTimePicker sollen Start-, und EndDaten gewählt werden. Bei Klick auf den Button, sollen dann alle Termin aus dem gewählten Zeitraum in der ListBox dargestellt werden.  Dieser Code wird ausgeführt:  private void btnShowApp_Click(object sender, EventArgs e)
{
    //Deklaration
    DateTime StartDate;
    DateTime EndDate;
    Outlook.MAPIFolder Calendar;
    Outlook.Items CalendarItems;
    Outlook.RecurrencePattern RecPat;

    // Gewählte Daten aus DateTimePickern abfragen
    StartDate = dtPFrom.Value;
    EndDate = dtPTo.Value;
    // Kalendar Ordner mit Mapi lesen
    Calendar = Globals.ThisAddIn.Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
    // Elemente Im Kalendar zuweisen
    CalendarItems = Calendar.Items;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }



            foreach (Outlook.AppointmentItem Entry in CalendarItems)
            {
                //Zugehörige Attribute der Appointments abfragen
                RecPat = Entry.GetRecurrencePattern();

                DateTime AppStart = RecPat.PatternStartDate.AddDays(RecPat.StartTime.ToOADate());
                DateTime AppEnd = RecPat.PatternEndDate.AddDays(RecPat.EndTime.ToOADate());

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }

&#160;

                if (AppStart &gt;= StartDate &amp;&amp; AppEnd &lt;= EndDate)

                {

                    lstResults.Items.Add(string.Format(&quot;{0} bis {1}: {2}&quot;, AppStart,AppEnd, Entry.Subject));
   
                }

            }

 }

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }

&#160;

Wenn wir dann den Code testen, sehen wir keinen Eintrag in der Listbox auch wenn der Terminkalendar im gewählten Zeitraum gut gefüllt ist.

Zunächst einmal ist wichtig zu Wissen was in den Eigenschaften der RecurrencePattern (RecPat) steht. PatternStartDate und PatternEndDate liefert nur das Datum ohne Uhrzeit. StartTime und EndTime nur die Zeit, so dass in jedem Fall addiert werden muss. (im BeispielCode bereits getan)

Als Beispiel ein Termin am 24.12.2009 von 19:00-20:00 Eingetragen liefert:

StartTime= 30.12.1899 19:00 Ok, nicht weiter verwunderlich, wenn man weiß, dass die Zeitrechnung in .Net intern als Abfolge von Tagen seit dem 31.12.1899 gespeichert wird.

EndTime= 3.01.1601 20:00 Für das Datum habe ich keine Erklärung, aber zumindest die Uhrzeit stimmt

PatternStartDate= 24.12.2009 

PatternEndDate = 31.12.4500 23:59 Scheinbar das größtmögliche Datum, auf jeden Fall nicht gesetzt (Das Problem)

&#160;

Die Lösung:

Zum Glück liefert und das ReccurencePattern Objekt noch eine weiter nützliche Eigenschaft. Duration. Wir Rechnen uns das EndDatum einfach selbst aus, indem wir das Startdatum um die Dauer addieren.

Folgende Zeile vor die Zuweisungen von AppStart und AppEnd eingefügt und schon funktionierts:

RecPat.PatternEndDate = RecPat.PatternStartDate.AddMinutes(RecPat.Duration);

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</description>
			<link>http://blogs.ppedv.de/tills/archive/Appointment-RecurrencePattern-Start--und-Endzeiten-richtig-auslesen</link>
			<author>Till Sch&#252;rmann </author>
			<pubDate>Tue, 01 Sep 2009 16:21:18 GMT</pubDate>
			<category domain="http://blogs.ppedv.de?tag=">
			.Net</category><category>Office</category><category>VSTO</category><category>C#</category><category>
			</category>
			
		</item>
	
		<item>
			<title>[Till Sch&#252;rmann] Variablen zwischen JScript und ASP.Net austauschen</title>
			<description>An vielen Stellen der ASP Programmierung wird der JScript Code automatisch generiert, an andreren Stellen muss man nach wie vor selbst Hand anlegen. Soweit so gut, was aber, wenn Variableninhalte von ASP.Net an eine JScript Funktion, oder vice versa, übergeben werden müssen.  In diesem Fall ist die einfachste Schnittstelle simples Html. Der Zugriff auf, beispielsweise, eine unsichtbare Textbox (&lt;input type=”hidden”&gt;) ist auf einfachen WebForms auch kein Problem.   Befindet sich das Html Element aber in einem Kontainer wie einem Panel oder einem ContentPlaceholder, ist der Zugriff nicht ganz so einfach.  Folgendes Beispiel:  2 ASP Buttons, eine ASP Textbox und eine normale Html Textbox.  &lt;asp:Button ID=&quot;BtnSet&quot; runat=&quot;server&quot; Text=&quot;Set Text From Asp&quot;
     OnClick=&quot;BtnSet_Click&quot; /&gt;
&lt;asp:TextBox ID=&quot;AspTextbox&quot; runat=&quot;server&quot;&gt;&lt;/asp:TextBox&gt;
&lt;br /&gt;
&lt;input ID=&quot;HtmlTextbox&quot; type=&quot;text&quot; runat=&quot;server&quot;/&gt;
&lt;asp:Button ID=&quot;BtnGet&quot; type=&quot;button&quot; Text=&quot;Get Text From Html&quot;
     runat=&quot;server&quot; OnClientClick=&quot;GetText();&quot; /&gt;


Beim Klick auf einen Button(BtnSet) wird Serverseitig der Inhalt aus einer ASP-Textbox ausgelesen und in eine Html Textbox geschrieben. 

 protected void BtnSet_Click(object sender, EventArgs e)
    {
        //Text aus Asp Textbox auslesen und in Html Textbox schreiben
        string Input = AspTextbox.Text;
        HtmlTextbox.Value = Input;
    }

Beim Klick auf den anderen Button soll dann der Inhalt aus der Html&#160; Textbox von einer JScript Funktion ausgelesen werden

function GetText() {
       var Output = document.getElementById(&quot;HtmlTextbox&quot;).value;
       alert(Output);
   }

Ist der Debugger aktiv, erhalten wir eine Fehlermeldung, dass ein Objekt erforderlich sei, also eine Null Referenz. Ist er nicht aktiv, liefert uns die alert Methode “undefined”, da die Variable Output keinen Inhalt hat.

Doch wie kann das sein? Schauen wir uns den Code mal genauer an.

&lt;input name=&quot;ctl00$ContentPlaceHolder1$HtmlTextbox&quot;
  type=&quot;text&quot; id=&quot;ctl00_ContentPlaceHolder1_HtmlTextbox&quot;
   value=&quot;Test&quot; /&gt;


Sowohl die name-, als auch die id-Attribute wurden umbenannt. Nun könnte man solche Seiten jedes Mal im Browser öffnen und überprüfen welchen Präfix die Elemente erhalten haben und das beim Zugriff entsprechend anpassen. Allerdings könnte sich Präfix auch schnell ändern, wenn das Element später mal in ein anderes Panel rutscht. Etwas eleganter ist folgende Syntax mit der man relativ bequem auf die Client ID zugreifen kann.

&lt;%=ElementName.ClientID%&gt;


Im oberen Beispiel sieht das dann so aus

function GetText() {
 var Output = document.getElementById(&quot;&lt;%=HtmlTextbox.ClientID%&gt;&quot;).value;  
 alert(Output);
 }</description>
			<link>http://blogs.ppedv.de/tills/archive/Variablen-zwischen-JScript-und-ASP.Net-austauschen</link>
			<author>Till Sch&#252;rmann </author>
			<pubDate>Tue, 11 Aug 2009 16:34:49 GMT</pubDate>
			<category domain="http://blogs.ppedv.de?tag=">
			.Net</category><category>ASP.NET</category><category>JScript</category><category>HTML</category><category>
			</category>
			
		</item>
	
		<item>
			<title>[Till Sch&#252;rmann] Kein FileSearch Objekts in Office 2007</title>
			<description>Wer unter Office 2003 schon mit VBA gearbeitet hat wird das FileSearch Objekt, zu einfachen Suche nach Dateien im System bestimmt kennen. Wer dann versucht seine VBA Makros unter Office 2007 laufen lassen will, wird schnell bemerken, dass das Filesearch Objekt unter Office 2007 nicht mehr existiert.   Diese Makro zeigt wie man mit wenig mehr Aufwand aber eine gleiche Funktionalit&#228;t gew&#228;hrleisten kann.   Unter Office 2003:  Das Makro nutzt das FileSearch Objekt um in einem bestimmten Ordner nach Dateien eines bestimmten Typs zu suchen und die Namen und Pfade der gefundene Dateien ins Word Dokument zu schreiben. Zus&#228;tzlich wird eine Meldung &#252;ber die Anzahl der gefundene Dateien ausgegeben.  &#160;  Unter Office 2007:  Das Ergebnis ist das gleiche wie beim Makro oben. Die DIR Funktion liefert uns hierbei die Dateien, die Collection dient als Foundfiles Auflistung und die Instr Funktion filtert uns die richtigen Dateien aus.  </description>
			<link>http://blogs.ppedv.de/tills/archive/Kein-FileSearch-Objekts-in-Office-2007</link>
			<author>Till Sch&#252;rmann </author>
			<pubDate>Wed, 18 Jun 2008 12:13:37 GMT</pubDate>
			<category domain="http://blogs.ppedv.de?tag=">
			Office</category><category>VB</category><category>
			</category>
			
		</item>
	
	        </channel>
		</rss>
	
    
    

