<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>softwarearbeiter.de</title>
	<atom:link href="http://www.softwarearbeiter.de/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.softwarearbeiter.de</link>
	<description>Software, das Universum und der ganze Rest...</description>
	<lastBuildDate>Tue, 24 Jan 2012 20:20:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Überschreiben virtueller Methoden verhindern</title>
		<link>http://www.softwarearbeiter.de/tipps-und-tricks/ueberschreiben-virtueller-methoden-verhindern/</link>
		<comments>http://www.softwarearbeiter.de/tipps-und-tricks/ueberschreiben-virtueller-methoden-verhindern/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 20:13:51 +0000</pubDate>
		<dc:creator>Markus</dc:creator>
				<category><![CDATA[Tipps und Tricks]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Keyword]]></category>
		<category><![CDATA[override]]></category>
		<category><![CDATA[Schlüsselwort]]></category>
		<category><![CDATA[sealed]]></category>
		<category><![CDATA[Vererbung]]></category>
		<category><![CDATA[virtual]]></category>

		<guid isPermaLink="false">http://www.softwarearbeiter.de/?p=4871</guid>
		<description><![CDATA[Was tut der Entwickler einer Komponente, der verhindern möchte, dass andere von seiner Klasse ableiten? Richtig. Er verwendet das sealed-Schlüsselwort: public sealed class Kobold { [...] } Aber was, wenn der Entwickler das weitere Überschreiben einer virtuellen Methode in einer abgeleiteten Klasse verhindern möchte? Auch hier hilft das sealed-Schlüsselwort: Diesmal allerdings nicht auf Klassenebene, sondern [...]]]></description>
			<content:encoded><![CDATA[<p>Was tut der Entwickler einer Komponente, der verhindern möchte, dass andere von seiner Klasse ableiten? Richtig. Er verwendet das <code class="keyword">sealed</code>-Schlüsselwort:</p>
<div class="listing">
<pre class="sunlight-highlight-csharp">public sealed class Kobold {
    [...]
}</pre>
</div>
<p>Aber was, wenn der Entwickler das weitere Überschreiben einer virtuellen Methode in einer abgeleiteten Klasse verhindern möchte? Auch hier hilft das <code class="keyword">sealed</code>-Schlüsselwort: Diesmal allerdings nicht auf Klassenebene, sondern bei der zu schützenden Methode.</p>
<div class="listing">
<pre class="sunlight-highlight-csharp">
public sealed override void SagHallo() {
    [...]
}</pre>
</div>
<p>Das erneute Überschreiben dieser Methode in einer abgeleiteten Klasse wird jetzt zu einem Compilerfehler führen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarearbeiter.de/tipps-und-tricks/ueberschreiben-virtueller-methoden-verhindern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Es geht weiter</title>
		<link>http://www.softwarearbeiter.de/allgemein/es-geht-weiter/</link>
		<comments>http://www.softwarearbeiter.de/allgemein/es-geht-weiter/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 17:02:32 +0000</pubDate>
		<dc:creator>Markus</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[this]]></category>

		<guid isPermaLink="false">http://www.softwarearbeiter.de/?p=4761</guid>
		<description><![CDATA[Lange war es ruhig in der SharePointZone - der letzte Artikel datiert auf den 29. Juni 2010. Nach über anderthalb Jahren habe ich mich nun entschlossen diesen Blog wiederzubeleben, allerdings mit neuem Namen und breiterem Fokus: Aus sharepointzone.de wird softwarearbeiter.de. Der Schwerpunkt dieses Blogs liegt nach wie vor auf Microsoft-Technologien, allerdings diesmal deutlich breiter gefächert [...]]]></description>
			<content:encoded><![CDATA[<p>Lange war es ruhig in der SharePointZone - der letzte Artikel datiert auf den 29. Juni 2010. Nach über anderthalb Jahren habe ich mich nun entschlossen diesen Blog wiederzubeleben, allerdings mit neuem Namen und breiterem Fokus: Aus sharepointzone.de wird <a href="http://www.softwarearbeiter.de/der-softwarearbeiter/">softwarearbeiter.de</a>.</p>
<p>Der Schwerpunkt dieses Blogs liegt nach wie vor auf Microsoft-Technologien, allerdings diesmal deutlich breiter gefächert und nicht auf den Themenkomplex SharePoint beschränkt. So wird es hier eine Sammlung von Tipps und Tricks, kleinen und großen Snippets und Tutorials und Artikeln über den Microsoft Technologie-Stack und Software-Entwicklung im Allgemeinen geben.</p>
<p>Ich freue mich auf viele Kommentare, Anregungen und Diskussionen - Informationen über neue Artikel gibt's im <a href="http://www.softwarearbeiter.de/feed">RSS-Feed</a> oder bei Twitter: <a href="http://www.softwarearbeiter.de/allgemein/es-geht-weiter/">@Spontifixus</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarearbeiter.de/allgemein/es-geht-weiter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Information Worker VM unter Windows 7</title>
		<link>http://www.softwarearbeiter.de/tutorials/information-worker-vm-unter-windows-7/</link>
		<comments>http://www.softwarearbeiter.de/tutorials/information-worker-vm-unter-windows-7/#comments</comments>
		<pubDate>Tue, 29 Jun 2010 16:24:07 +0000</pubDate>
		<dc:creator>Markus</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[CONTOSO]]></category>
		<category><![CDATA[Hyper-V]]></category>
		<category><![CDATA[Information Worker VM]]></category>
		<category><![CDATA[Konvertierung]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[SharePoint 2010]]></category>
		<category><![CDATA[v2v]]></category>
		<category><![CDATA[VirtualMachine]]></category>
		<category><![CDATA[VMWare]]></category>
		<category><![CDATA[Windows 7]]></category>
		<category><![CDATA[Windows Server 2008 R2]]></category>

		<guid isPermaLink="false">http://www.sharepointzone.de/?p=3251</guid>
		<description><![CDATA[Microsoft stellt zum Testen und Evaluieren der Information Worker Solutions netterweise eine fertig installierte und vorkonfigurierte VirtualMachine zur Verfügung. Allerdings benötigt man zur Ausführung der VMs zwingend Windows Server 2008 R2, da Microsoft die VMs ausschließlich als HyperV VMs bereitstellt. Will man diese VMs auf einem Notebook ausführen (z.B. für eine Demonstration beim Kunden) ohne [...]]]></description>
			<content:encoded><![CDATA[<p><img class="teaser" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/06/VMware_Player_snapshot-150x150.jpg" />Microsoft stellt zum Testen und Evaluieren der Information Worker Solutions netterweise eine <a class="external" target="_blank" href="http://www.microsoft.com/downloads/details.aspx?FamilyID=751fa0d1-356c-4002-9c60-d539896c66ce&#038;displaylang=en"> fertig installierte und vorkonfigurierte VirtualMachine</a> zur Verfügung. Allerdings benötigt man zur Ausführung der VMs zwingend Windows Server 2008 R2, da Microsoft die VMs ausschließlich als HyperV VMs bereitstellt. Will man diese VMs auf einem Notebook ausführen (z.B. für eine Demonstration beim Kunden) ohne gleich Windows Server 2008 R2 auf dem Notebook zu installieren, muss man die Virtual Machiness in eine geeignete Form konvertieren, die sich z.B. mit dem <a class="external" target="_blank" href="http://downloads.vmware.com/de/d/info/desktop_downloads/vmware_player/3_0">VMWare Player</a> abspielen lässt.<span id="more-3251"></span></p>
<div class="box caution">
<p><span class="caption">Achtung:</span> Da das Gast-Betriebssystem ein 64Bit-System ist, muss auch das Host-System ein 64Bit-System sein! Zusätzlich ist die von Microsoft bereitgestellte VM extrem ressourcenhungrig. Das Notebook sollte daher mindestens 8 GB Arbeitsspeicher mitbringen!</p>
</div>
<p>Was muss man also tun, um eine HyperV-Maschine in eine solche zu konvertieren, die sich im VMWare-Player abspielen lässt? Dazu braucht es einige Schritte, einige Software und einige Geduld. Vorraus-setzung für die Umwandlung der Maschine sind folgende Tools:</p>
<ul>
<li>Der <a class="external" target="_blank" href="http://downloads.vizioncore.com/">vConverter SC - 4.2</a> der kostenlos von verizoncore zur Verfügung gestellt wird und</li>
<li>eine Windows 7 Recovery Disk, die z.B. von <a class="external" target="_blank" href="http://neosmart.net/blog/2009/windows-7-system-repair-discs/">Neosmart</a> zum Download angeboten wird.</li>
</ul>
<h3>Schritt 1: Vorbereiten der Information Worker VM</h3>
<p>Der erste Schritt auf dem Weg zu einer VMWare-fähigen Information Worker VM ist eine in einer HyperV-Umgebung aufgesetzte Information Worker VM. Die Lizenz der von Microsoft zur Verfügung gestellten VM ist leider fürs erste abgelaufen, es empfiehlt sich daher, die 10 tägige "Gnadenfrist" zur Verwendung der Maschine noch einmal zurückzusetzen bevor mit der Konvertierung begonnen wird (Start -> All Programs -> rearm -> Rearm Windows), da sonst die VM nach zwei Stunden automatisch herunterfährt.</p>
<div class="box tipp">
<p><span class="caption">Tipp:</span> Da die Information Worker VM nach einer Aktivierung des Betriebssystems genau 180 Tage läuft, empfiehlt es sich, auf die Aktivierung zu verzichten und ein noch nicht aktiviertes System zu migrieren um die Migration nicht alle 180 Tage erneut durchführen zu müssen!</p>
</div>
<p>Damit der vConverter die Konvertierung durchführen kann muss die HyperV-VM vom Hostsystem erreichbar sein. Zusätzlich muss jedes Laufwerk das konvertiert werden soll über eine Dateifreigabe verfügen, da sonst der vConverter nicht auf die Daten zugreifen kann. Stellen Sie darüber hinaus sicher, dass die Firewall des Gastsystems abgeschaltet ist (Start -> Run -> "firewall.cpl"). Sind die hier genannten Vorraussetzungen erfüllt ist die HyperV-VM erfolgreich auf die Migration vorbereitet worden.</p>
<div class="box caution">
<p><span class="caption">Achtung:</span> Einige Installationen von Windows Server 2008 R2 und Windows 7 bringen eine 100 MB große Systempartition mit, der kein Laufwerksbuchstabe zugeordnet wurde. Damit diese Partition migriert werden kann, muss dieser zunächst ein Laufwerksbuchstabe zugeordnet werden!</p>
</div>
<h3>Schritt 2: Migration der HyperV VM</h3>
<p>Starten Sie zunächst den vConverter. Anschließend rufen Sie den Assistenten zur Erstellung einer neuen Konvertierungsaufgabe über die Symbolleiste auf.</p>
<div class="image" style="width:521px;"><img style="width:521px;" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/06/screen_0.png">
<p><strong>Abb. 12:</strong> Neue Konvertierungsaufgabe starten</p>
</div>
<p>Im ersten Schritt des Assistenten werden sie aufgefordert den Namen des Quellsystems und die entsprechenden Zugangsdaten einzutragen. Tragen Sie hier den Namen "demo2010a" sowie den Benutzernamen "CONTOSO\Administrator" mit dazugehörigem Passwort ein.</p>
<div class="image" style="width:600px;"><a rel="prettyPhoto3251" title="<strong>Abb. 13:</strong> Daten des Quellsystems eintragen" href="http://www.softwarearbeiter.de/wp-content/uploads/2010/06/screen_1.png"><img style="width:600px;" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/06/screen_1.png"></a>
<p><strong>Abb. 13:</strong> Daten des Quellsystems eintragen</p>
</div>
<p>Im zweiten Schritt werden Optionen der neu zu erstellenden VM abgefragt. Wählen Sie für die Art der zu erstellenden VM "VMWare&reg;" aus. Als Ziel wählen Sie "Freigegebener Netzwerkordner" aus, und bei Ziel tragen Sie den Ordner ein, wo die migrierte VM später landen soll. Sollte der Ordner nicht auf der aktuellen Maschine liegen können Sie über die Schaltfläche "Anmeldenamen festlegen" die Zugangsdaten für den Zugriff auf den weiter oben festgelegten Ordner eintragen. Zusätzlich geben Sie den Namen der neuen VM an, z.B. "DEMO2010A".</p>
<div class="image" style="width:600px;"><a rel="prettyPhoto3251" title="<strong>Abb. 14:</strong> Ausgabedatei festlegen" href="http://www.softwarearbeiter.de/wp-content/uploads/2010/06/screen_2.png"><img style="width:600px;" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/06/screen_2.png"></a>
<p><strong>Abb. 14:</strong> Ausgabedatei festlegen</p>
</div>
<p>Im nächsten Schritt wählen Sie die zu konvertierenden Datenträger aus.</p>
<div class="image" style="width:600px;"><a rel="prettyPhoto3251" title="<strong>Abb. 15:</strong> Zu konvertierende Datentr&auml;ger ausw&auml;hlen" href="http://www.softwarearbeiter.de/wp-content/uploads/2010/06/screen_3.png"><img style="width:600px;" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/06/screen_3.png"></a>
<p><strong>Abb. 15:</strong> Zu konvertierende Datentr&auml;ger ausw&auml;hlen</p>
</div>
<p>Im vierten Schritt werden die Angaben zur Hardware der zu erstellenden VM abgefragt. Hier sind ein paar mehr Einstellungen nötig. Setzen Sie in diesem Dialog den Adaptertyp auf LSI und öffnen Sie anschließend die erweiterten Einstellungen durch Klick auf die Schaltfläche "Virtual Machine konfigurieren". Im sich dann öffnenden Dialog setzen Sie den Wert für den Arbeitsspeicher auf einen Wert deutlich größer als 5000 MB, z.B. auf 7168 MB. Microsoft empfiehlt für diese VM einen Arbeitsspeicher von 8 GB.</p>
<div class="image" style="width:600px;"><a rel="prettyPhoto3251" title="<strong>Abb. 16:</strong> Hardware der zu erstellenden VM" href="http://www.softwarearbeiter.de/wp-content/uploads/2010/06/screen_4.png"><img style="width:600px;" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/06/screen_4.png"></a>
<p><strong>Abb. 16:</strong> Hardware der zu erstellenden VM</p>
</div>
<p>Schließen Sie nun im fünften Schritt den Assistenten ab und starten Sie die Konvertierung mit einem Klick auf "Alle Aufgaben Starten" auf dem Tab "Conversion Tasks".</p>
<div class="image" style="width:550px;"><img style="width:550px;" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/06/screen_6.png">
<p><strong>Abb. 17:</strong> Konvertierung starten</p>
</div>
<p>Die Konvertierung kann je nach verwendetem System deutlich mehr als eine Stunde Zeit benötigen. Währen die Konvertierung läuft können Sie sich über einen Klick auf das Lupensymbol des Auftrags den Fortschritt der Konvertierung anzeigen lassen.</p>
<h3>Schritt 3: Erstellen einer startbaren VM</h3>
<p>In den ersten beiden Schritten haben Sie eine VDMK-Datei erstellt, die die Information Worker VM enthält. Im dritten Schritt wird dieses System nun so aufbereitet, dass es vom aktuellsten VMWare Player (Version 3.1.0) abgespielt werden kann.</p>
<p>Der schnellste Weg zu einer lauffähigen VMX-Datei ist es, im VMWare-Player durch Klick auf die Schaltfläche "Create a New Virtual Machine" eine neue Virtual Machine anzulegen. Der sich daraufhin öffnende Assistent führt Sie in wenigen Schritten zu einer neuen nackten VM ohne Betriebssystem. Beim Erstellen der VM gehen Sie wie folgt vor: Wählen Sie im ersten Schritt die Option, das Betriebssystem später von Hand zu installieren. Im nächsten Schritt wählen Sie das Betriebssystem "Windows Server 1008 R2 x64". Im dritten Schritt geben Sie der Maschine einen Namen und einen Speicherort Ihrer Wahl. Anschließend stellen Sie eine Festplattengröße von 127 GB ein und wählen die Option die Festplatte in einer einzelnen Datei abzulegen. Klicken Sie im nächsten Schritt sie "Customize Hardware" und stellen Sie eine Arbeitsspeichergröße von 7168 MB ein. Mit einem Klick auf "Finish" beenden Sie den Assistenten.<br />
Öffnen Sie jetzt die neuerstellte VMX-Datei mit einem Texteditor und tragen Sie in der Zeile "scsi0:0.fileName" den Pfad der in den vorherigen Schritten erzeugten VDMK-Datei der Information-Worker VM ein.</p>
<h3>Schritt 4: Patchen des Systems</h3>
<p>Trotz den in Schritt 3 durchgeführten Maßnahmen ist das System noch nicht lauffähig. Windows wird beim Hochfahren der VM hängenbleiben oder sich mit einem Bluescreen verabschieden. Um das zu verhindern sind einige weitere Schritte nötig. Zum Patchen des erzeugten Systems in diesem Schritt wird die Windows 7 Recovery Disk benötigt. Laden Sie dazu vor dem Starten der VM die entsprechende ISO-Datei in das DVD-Laufwerk der VM.</p>
<p>Starten sie die VM von der Recovery-Disk. Dazu kann es sein, dass sie während dem starten der VM sehr schnell auf "F2" drücken müssen um in die BIOS-Einstellungen der VM zu kommen. Hier wählen Sie den Reiter "Boot" und setzen dort das CD-Laufwerk an die erste Stelle der Bootreihenfolge.</p>
<div class="image" style="width:600px;"><a rel="prettyPhoto3251" title="<strong>Abb. 18:</strong> BIOS-Einstellungen der VM" href="http://www.softwarearbeiter.de/wp-content/uploads/2010/06/screen_7.png"><img style="width:600px;" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/06/screen_7-648x535.png"></a>
<p><strong>Abb. 18:</strong> BIOS-Einstellungen der VM</p>
</div>
<p>Beim Starten von der Recovery-Disk wird Windows Fehler im Bootsektor der Festplatte finden und beheben. Starten Sie die VM danach erneut von der CD. Die Recovery-Disk fährt danach hoch und bietet dann einige Optionen. Starten Sie die Kommandozeile durch Klick auf den Button "Command Prompt", und öffnen Sie dann über das Kommando "regedit" den Windows-Registrierungseditor.</p>
<div class="image" style="width:485px;"><img style="width:485px;" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/06/screen_8.png">
<p><strong>Abb. 19:</strong> Kommandozeile &ouml;ffnen</p>
</div>
<p>Im Registrierungs-Editor selektieren Sie den Ordner "HKEY_LOCAL_MACHINE". Im Menü "File" wählen Sie anschließend "Load Hive...". Dort navigieren Sie zum Ordner "C:\Windows\System32\config" und öffnen von dort die Datei "SYSTEM". Beim Öffnen fragt der Registrierungs-Editor einen Namen ab, hier "p2v" eingeben.</p>
<div class="box caution">
<p><span class="caption">Achtung:</span> Der "Load Hive..."-Dialog befindet sich beim Öffnen standardmäßig im System32-Ordner der laufenden Windows-Instanz, also der Recovery-Disk. Dies ist nicht der Windows-Ordner der Information Worker VM!</p>
</div>
<div class="image" style="width:600px;"><img style="width:600px;" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/06/screen_101.png">
<p><strong>Abb. 20:</strong> Load Hive...</p>
</div>
<div class="image" style="width:563px;"><img style="width:563px;" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/06/screen_9.png">
<p><strong>Abb. 21:</strong> Datei &quot;SYSTEM&quot; &ouml;ffnen</p>
</div>
<p>Nachdem Sie den Hive geladen haben navigieren Sie zum Eintrag "HKEY_LOCAL_MACHINE\p2v\ControlSet001\Services\LIS_SAS" und ändern dort den REG_DWORD-Wert von "Start" von 3 auf 0. Anschließend selektieren Sie den Ordner "p2v" und klicken Sie im Menü "File" den Eintrag "Unload Hive...".</p>
<div class="image" style="width:600px;"><img style="width:600px;" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/06/screen_11.png">
<p><strong>Abb. 22:</strong> REG_DWORD-Wert &quot;Start&quot; auf 0 &auml;ndern</p>
</div>
<p>Zum Abschluss starten Sie die VM neu. Um die Arbeit mit der VM zu vereinfachen, empfiehlt es sich, im Anschluss an den Neustart die VMWare-Tools zu installieren. Der VMWare-Player blendet in der Regel einen entsprechenden Hinweis ein. Damit die VM nicht bei jedem weiteren Start von der Recovery-Disk startet, ist es sinnvoll, entweder die Recovery-Disk zu entladen oder die Bootreihenfolge im BIOS der VM wieder auf den ursprünglichen Wert zurückzustellen.</p>
<p><span class="small">Mein Dank geht an <a class="external" target="_blank" href="http://sharepointcommunity.de/blogs/mgreth/">Michael Greth</a> von der <a class="external" target="_blank" href="http://www.sharepointcommunity.de">SharePointCommunity</a>, der mir die initialen Tipps gab, wie hier zu verfahren ist, sowie an die Daniel Oberli von der Seite <a href="http://www.softwarearbeiter.de/tutorials/information-worker-vm-unter-windows-7/">scolab.ch</a>, der mit sinem Tutorial den Grundstein für diese Anleitung gelegt hat.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarearbeiter.de/tutorials/information-worker-vm-unter-windows-7/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Eigenes ListTemplate definieren</title>
		<link>http://www.softwarearbeiter.de/tutorials/eigenes-listtemplate-definieren/</link>
		<comments>http://www.softwarearbeiter.de/tutorials/eigenes-listtemplate-definieren/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 17:45:32 +0000</pubDate>
		<dc:creator>Markus</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Listen-Template]]></category>
		<category><![CDATA[ListTemplate]]></category>
		<category><![CDATA[schema.xml]]></category>
		<category><![CDATA[SharePoint 2007]]></category>
		<category><![CDATA[ViewStyle-Tag]]></category>

		<guid isPermaLink="false">http://www.sharepointzone.de/?p=2441</guid>
		<description><![CDATA[Eine häufige Aufgabe bei der Entwicklung einer SharePoint-Applikation ist die Definition eines Listen-Templates. Weil man sich da, insbesondere bei der Anpassung der Datei schema.xml, entgegen landläufiger Meinung eine Menge Arbeit sparen kann möchte ich an dieser Stelle kurz darauf eingehen. Das folgende Beispiel basiert auf der Annahme, dass das ListTemplate "BaumListe" mit Elementen des neu [...]]]></description>
			<content:encoded><![CDATA[<p><img class="teaser" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/02/teaser_baeume-150x150.png" />Eine häufige Aufgabe bei der Entwicklung einer SharePoint-Applikation ist die Definition eines Listen-Templates. Weil man sich da, insbesondere bei der Anpassung der Datei <code>schema.xml</code>, entgegen landläufiger Meinung eine Menge Arbeit sparen kann möchte ich an dieser Stelle kurz darauf eingehen.</p>
<p>Das folgende Beispiel basiert auf der Annahme, dass das ListTemplate "BaumListe" mit Elementen des neu definierten ContentTypes "Baum" mit den Spalten "Name" und "Kategorie" umgehen können soll.<span id="more-2441"></span></p>
<div class="image" style="width:444px;"><img style="width:444px;" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/02/screenshot_baeume.png"></div>
<p>Der erste Schritt zur Erzeugung eines solchen ListTemplates ist die Definition desselben innerhalb eines Features. Das kann man direkt in der <code>&lt;Elements&gt;</code>-Section der Datei <code>feature.xml</code> machen; der Übersichtlichkeit halber lagert man das aber idealerweise in eine eigene Datei aus und refernziert diese aus der Datei <code>feature.xml</code>. Nachfolgend der Code für die Datei <code>feature.xml</code>...</p>
<div class="listing">
<pre class="sunlight-highlight-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
&lt;Feature ... &gt;
    &lt;ElementManifests&gt;
        &lt;ElementManifest Location=&quot;baumListeListTemplate.xml&quot; /&gt;
    &lt;/ElementManifests&gt;
&lt;/Feature&gt;</pre>
</div>
<p>...und für die Datei <code>baumListeListTemplate.xml</code> die das eigentliche ListTemplate definiert:</p>
<div class="listing">
<pre class="sunlight-highlight-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;
&lt;Elements xmlns=&quot;http://schemas.microsoft.com/sharepoint/&quot;&gt;
    &lt;ListTemplate Type=&quot;10001&quot;
                  BaseType=&quot;0&quot;
                  Name=&quot;BaumListe&quot;
                  DisplayName=&quot;B&Atilde;&curren;ume&quot;
                  Description=&quot;Liste um B&Atilde;&curren;ume zu speichern&quot;
                  SecurityBits=&quot;11&quot;
                  Category=&quot;Custom Lists&quot;
                  Sequence=&quot;100&quot;
                  Image=&quot;/_layouts/images/itgen.gif&quot; /&gt;
&lt;/Elements&gt;</pre>
</div>
<p>Diese beiden Dateien definieren die Eigenschaften des neuen ListTemplates. Um das Template selber nun mit Leben zu füllen, fehlt noch eine dritte Datei. Diese Datei ist die wichtigste und zugleich die umfangreichste bei der Definition eines ListTemplates.</p>
<div class="image" style="width:179px;"><img style="width:179px;" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/02/screenshot_ordnerstruktur_baumListe.png">
<p><strong>Abb. 4:</strong> Ordnerstruktur des Features</p>
</div>
<p>Verfügbare Felder und ContentTypes und die Ansichten der Liste werden in der Schema-Definition des Listen-Templates definiert. Diese Datei muss immer den Namen <code>schema.xml</code> tragen und immer in einem Ordner liegen, der genau so heißt wie das Listen-Template. Die Ordnerstruktur in unserem Feature sieht dann in etwa so aus wie auf dem Bild rechts. Die Datei <code>schema.xml</code> selbst ist eine Datei, die den Entwickler zunächst durch ihre schiere Größe (gerne mehrere tausend Code-Zeilen) abschreckt. Eine einfache Möglichkeit diese Datei zu erstellen ist es daher, sie schlichtweg von einem bereits bestehenden ListenTemplate zu kopieren und sie anschließend anzupassen.</p>
<p>Eine noch einfachere Möglichkeit ist es, diese Datei von Grund auf selbst zu erstellen. Das ist nicht halb so aufwändig wie man glauben mag, wenn man SharePoint das machen lässt, was es bereits von Haus aus mitbringt. Grundsätzlich gliedert sich die Datei schema.xml in vier Bereiche, in denen die zugeordneten ContentTypes, die Listenfelder, die Views und die Formulare zum Anzeigen und Bearbeiten der Daten definiert werden:</p>
<div class="listing">
<pre class="sunlight-highlight-xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;List ... &gt;
    &lt;MetaData&gt;
        &lt;ContentTypes&gt; ... &lt;/ContentTypes&gt;
        &lt;Fields&gt; ... &lt;/Fields&gt;
        &lt;Views&gt; ... &lt;/Views&gt;
        &lt;Forms&gt; ... &lt;/Forms&gt;
    &lt;/MetaData&gt;
&lt;/List&gt;</pre>
</div>
<p>Auch das List-Tag selber enthält bereits eine Menge Information über das Listen-Template:</p>
<div class="listing">
<pre class="sunlight-highlight-xml">&lt;List xmlns:ows=&quot;Microsoft SharePoint&quot;
      xmlns=&quot;http://schemas.microsoft.com/sharepoint/&quot;
      Title=&quot;BaumListe&quot;
      Direction=&quot;LTR&quot;
      Url=&quot;Lists/BaumListe&quot;
      EnableContentTypes=&quot;TRUE&quot;
      BaseType=&quot;0&quot;&gt;</pre>
</div>
<p>Wichtigstes Attribut in diesem Zusammen ist <code>EnableContentTypes</code>, dass die Verwaltung von ContentTypes ermöglicht, damit der Benutzer später beim Erstellen von neuen Elementen den ContentType aus dem Menü auswählen kann, und wir bereits zur Entwicklungszeit bestimmte ContentTypes zuordnen, oder deren Zuordnung entfernen können.</p>
<p>Innerhalb der <code>&lt;ContentTypes&gt;</code>-Section können wir festlegen welche ContentTypes der Liste zugeordnet werden sollen. Da wir nur Bäume in unserer Liste erfassen wollen fügen wir auch nur diesen ContentType hinzu:</p>
<div class="listing">
<pre class="sunlight-highlight-xml">&lt;ContentTypes&gt;
    &lt;ContentTypeRef ID=&quot;0x01000d00a9d2a1a34505af32f7c1e94abeac&quot; /&gt;
&lt;/ContentTypes&gt;</pre>
</div>
<p>Innerhalb der <code>&lt;Fields&gt;</code>-Section müssen alle Felder die die Liste enthalten soll definiert werden. Standardmäßig sollten mindestens die ersten drei der im folgenden Code-Snippet gezeigten Felder definiert sein, denn diese stellen einige der Basisfeatures (Link zum Öffnen, Menü zum Bearbeiten und das Title-Feld) der Listenelemente zur Verfügung. Da wir im konkreten Fall aber den Namen des Baums anzeigen wollen setzen wir das <code>DisplayName</code>-Attribut auf den Wert "Name".</p>
<div class="box caution">
<p><span class="caption">Achtung:</span> Damit jedoch alle zugeordneten ContentTypes korrekt funktionieren, müssen sämtlich darin verwendeten Felder hier nochmals explizit deklariert werden!</p>
</div>
<div class="listing">
<pre class="sunlight-highlight-xml">&lt;Fields&gt;
    &lt;Field Name=&quot;LinkTitle&quot;
           ID=&quot;{82642ec8-ef9b-478f-acf9-31f7d45fbc31}&quot;
           DisplayName=&quot;Name&quot;
           Type=&quot;Text&quot;
           Sealed=&quot;TRUE&quot;
           SourceID=&quot;http://schemas.microsoft.com/sharepoint/v3&quot;
           StaticName=&quot;LinkTitle&quot;&gt;
    &lt;/Field&gt;
    &lt;Field Name=&quot;LinkTitleNoMenu&quot;
           ID=&quot;{bc91a437-52e7-49e1-8c4e-4698904b2b6d}&quot;
           DisplayName=&quot;Name&quot;
           Type=&quot;Text&quot;
           Sealed=&quot;TRUE&quot;
           SourceID=&quot;http://schemas.microsoft.com/sharepoint/v3&quot;
           StaticName=&quot;LinkTitleNoMenu&quot;&gt;
    &lt;/Field&gt;
    &lt;Field Name=&quot;Title&quot;
           ID=&quot;{fa564e0f-0c70-4ab9-b863-0177e6ddd247}&quot;
           DisplayName=&quot;Name&quot;
           Sealed=&quot;TRUE&quot;
           SourceID=&quot;http://schemas.microsoft.com/sharepoint/v3&quot;
           Type=&quot;Text&quot;
           StaticName=&quot;Title&quot;&gt;
    &lt;/Field&gt;
    &lt;Field Name=&quot;BaumKategorie&quot;
           ID=&quot;{ca8ef968-3308-4c2a-b08b-e17e686aacc3}&quot;
           DisplayName=&quot;Kategorie&quot;
           SourceID=&quot;http://schemas.microsoft.com/sharepoint/v3&quot;
           Type=&quot;Text&quot;
           StaticName=&quot;BaumKategorie&quot;&gt;
    &lt;/Field&gt;
&lt;/Fields&gt;</pre>
</div>
<p>Die <code>&lt;Views&gt;</code>-Section ist in der Regel bei weitem die umfangreichste Section der Datei <code>schema.xml</code>. Aber hier bietet SharePoint großes Vereinfachungspotential. Mit Hilfe des <code>&lt;ViewStyle&gt;</code>-Tags kann man nämlich aus einer Reihe von vorgefertigten Views auswählen, ohne diese explizit nochmals definieren zu müssen. Ein ganz einfacher View für unsere Baum-Liste könnte z.B. so aussehen:</p>
<div class="listing">
<pre class="sunlight-highlight-xml">&lt;Views&gt;
    &lt;View BaseViewID=&quot;0&quot;
          Type=&quot;HTML&quot;
          WebPartZoneID=&quot;Main&quot;
          DisplayName=&quot;All Items&quot;
          DefaultView=&quot;TRUE&quot;
          MobileView=&quot;True&quot;
          MobileDefaultView=&quot;False&quot;
          SetupPath=&quot;pages\viewpage.aspx&quot;
          ImageUrl=&quot;/_layouts/images/itgen.gif&quot;
          Url=&quot;AllItems.aspx&quot;&gt;
        &lt;ViewStyle ID=&quot;0&quot;/&gt;
        &lt;RowLimit Paged=&quot;TRUE&quot;&gt;100&lt;/RowLimit&gt;
        &lt;Toolbar Type=&quot;Standard&quot; /&gt;
        &lt;ViewFields&gt;
            &lt;FieldRef Name=&quot;LinkTitleNoMenu&quot; /&gt;
            &lt;FieldRef Name=&quot;BaumKategorie&quot;/&gt;
        &lt;/ViewFields&gt;
        &lt;Query&gt;
            &lt;OrderBy&gt;
                &lt;FieldRef Name=&quot;Title&quot;/&gt;
            &lt;/OrderBy&gt;
        &lt;/Query&gt;
    &lt;/View&gt;
&lt;/Views&gt;</pre>
</div>
<p>Das <code>&lt;ViewStyle&gt;</code>-Tag referenziert die in der Datei <code>VWSTYLES.XML</code> im Ordner <code>\TEMPLATE\GLOBAL\XML\</code> des 12-Hives der SharePoint-Installation definierten Views. Die in diesem Fall verwendete ID 0 referenziert die von SharePoint standardmäßig verwendete Listenansicht.</p>
<p>Zu guter Letzt braucht unser Listen-Template auch noch die Formulare zum Erstellen, Bearbeiten und Anzeigen der einzelen Listenelemente. Dafür können wir getrost das übernehmen, was SharePoint uns Standardmäßig zur Verfügung stellt:</p>
<div class="listing">
<pre class="sunlight-highlight-xml">&lt;Forms&gt;
    &lt;Form Type=&quot;DisplayForm&quot;
          Url=&quot;DispForm.aspx&quot;
          SetupPath=&quot;pages\form.aspx&quot;
          WebPartZoneID=&quot;Main&quot; /&gt;
    &lt;Form Type=&quot;EditForm&quot;
          Url=&quot;EditForm.aspx&quot;
          SetupPath=&quot;pages\form.aspx&quot;
          WebPartZoneID=&quot;Main&quot; /&gt;
    &lt;Form Type=&quot;NewForm&quot;
          Url=&quot;NewForm.aspx&quot;
          SetupPath=&quot;pages\form.aspx&quot;
          WebPartZoneID=&quot;Main&quot; /&gt;
&lt;/Forms&gt;</pre>
</div>
<p>Haben wir all das erledigt und das Feature ordnungsgemäß veröffentlicht und aktiviert, können wir eine neue Liste auf Basis unseres soeben erstellten Listen-Templates erstellen, die dann hoffentlich so aussieht wie auf dem Bild ganz am Anfang des Beitrags.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarearbeiter.de/tutorials/eigenes-listtemplate-definieren/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>LookUp-Feld per Code ändern</title>
		<link>http://www.softwarearbeiter.de/tipps-und-tricks/lookup-feld-per-code-aendern/</link>
		<comments>http://www.softwarearbeiter.de/tipps-und-tricks/lookup-feld-per-code-aendern/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 16:57:28 +0000</pubDate>
		<dc:creator>Markus</dc:creator>
				<category><![CDATA[Tipps und Tricks]]></category>
		<category><![CDATA[LookUp-Field]]></category>
		<category><![CDATA[SharePoint 2007]]></category>
		<category><![CDATA[SPFieldLookupValue]]></category>
		<category><![CDATA[SPListItem]]></category>

		<guid isPermaLink="false">http://www.sharepointzone.de/?p=1601</guid>
		<description><![CDATA[Möchte man einem Lookup-Feld einen bestimmten Wert zuweisen so ist es mitnichten damit getan dem Feld die ID oder gar die UniqueID des verlinkten ListenItems zu übergeben. Das liegt daran, dass SharePoint die Werte intern als Kombination aus ID des ListenItems und anzuzeigendem Wert speichert. Als Beispiel diene uns hier eine Liste mit Kategorien und [...]]]></description>
			<content:encoded><![CDATA[<p>Möchte man einem Lookup-Feld einen bestimmten Wert zuweisen so ist es mitnichten damit getan dem Feld die ID oder gar die UniqueID des verlinkten ListenItems zu übergeben. Das liegt daran, dass SharePoint die Werte intern als Kombination aus ID des ListenItems und anzuzeigendem Wert speichert. Als Beispiel diene uns hier eine Liste mit Kategorien und eine Liste mit Bäumen, die jeweils einer Kategorie zugeordnet sind:<span id="more-1601"></span></p>
<div class="image" style="width:444px;"><img style="width:444px;" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/01/screenshot_kategorie.png">
<p><strong>Abb. 3:</strong> Kategorien</p>
</div>
<div class="image" style="width:445px;"><img style="width:445px;" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/01/screenshot_baum.png">
<p><strong>Abb. 4:</strong> B&auml;ume</p>
</div>
<p>Das Lookup-Feld, in dem die Tanne der Kategorie Nadelbaum zugeordnet wird enthält den Wert <code>1:#Nadelbaum</code>, der sich zusammensetzt aus der ID des refernzierten ListItems und dem Wert der anzuzeigenden Spalte.</p>
<p>Möchte man ein neues Item hinzufügen und diesem eine Kategorie zuweisen, reicht es allerdings nicht der Spalte einfach die ID vom ListItem zuzuweisen. Folgender Code wird nicht funktionieren:</p>
<div class="listing">
<pre class="sunlight-highlight-csharp">SPListItem fichte = baumListe.Items.Add();
fichte[&quot;Kategorie&quot;] = 1;</pre>
</div>
<p>Statt dessen könnte man hingehen und den Wert von Hand zusammenbauen. Netterweise stellt einem SharePoint für diese Zwecke aber die Klasse <code>SPFieldLookupValue</code> zur Verfügung mit der sich das einfach erledigen lässt.</p>
<div class="listing">
<pre class="sunlight-highlight-csharp">SPListItem katNadelbaum = kategorienListe.GetItemById(1);
SPListItem fichte = baumListe.Items.Add();
fichte [&quot;Kategorie&quot;] = new SPFieldLookupValue(katNadelbaum.ID, katNadelbaum.Title);
fichte.Update()</pre>
</div>
<div class="box caution">
<p><span class="caption">Achtung:</span> Nach dem Ändern die <code>Update()</code>-Methode auf dem geänderten ListItem aufrufen, sonst werden die Änderungen nicht wirksam!</p>
</div>
<p>Die Klasse <code>SPFieldLookupValue</code> erspart einem also nicht das Nachschlagen der entsprechenden Werte, aber man bekommt auf diese Weise einfach eine gültige Zuweisung.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarearbeiter.de/tipps-und-tricks/lookup-feld-per-code-aendern/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ListItems eines bestimmten ContentTypes auslesen</title>
		<link>http://www.softwarearbeiter.de/tipps-und-tricks/listitems-eines-bestimmten-contenttypes-auslesen/</link>
		<comments>http://www.softwarearbeiter.de/tipps-und-tricks/listitems-eines-bestimmten-contenttypes-auslesen/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 17:13:07 +0000</pubDate>
		<dc:creator>Markus</dc:creator>
				<category><![CDATA[Tipps und Tricks]]></category>
		<category><![CDATA[ContentType]]></category>
		<category><![CDATA[SharePoint 2007]]></category>
		<category><![CDATA[SPContentTypeId]]></category>
		<category><![CDATA[SPList]]></category>
		<category><![CDATA[SPListItem]]></category>
		<category><![CDATA[SPQuery]]></category>

		<guid isPermaLink="false">http://www.sharepointzone.de/?p=1621</guid>
		<description><![CDATA[Aus einer Liste die Items eines bestimmten ContenTypes auszulesen klingt zunächst nach einer trivialen Aufgabe.  Sucht man lediglich anhand des Namens eines ContentTypes ist es das auch. In diesem Fall reichen für eine entspreches CAML-Abfrage ein paar wenige Zeilen Code: &#60;Where&#62; &#60;Eq&#62; &#60;FieldRef Name=&#34;ContentType&#34; /&#62; &#60;Value Type=&#34;Text&#34;&#62;Contact&#60;/Value&#62; &#60;/Eq&#62; &#60;/Where&#62; Will man jedoch nicht nur nach [...]]]></description>
			<content:encoded><![CDATA[<p>Aus einer Liste die Items eines bestimmten ContenTypes auszulesen klingt zunächst nach einer trivialen Aufgabe.  Sucht man lediglich anhand des Namens eines ContentTypes ist es das auch. In diesem Fall reichen für eine entspreches CAML-Abfrage ein paar wenige Zeilen Code:</p>
<div class="listing">
<pre class="sunlight-highlight-xml">&lt;Where&gt;
    &lt;Eq&gt;
        &lt;FieldRef Name=&quot;ContentType&quot; /&gt;
        &lt;Value Type=&quot;Text&quot;&gt;Contact&lt;/Value&gt;
    &lt;/Eq&gt;
&lt;/Where&gt;</pre>
</div>
<p>Will man jedoch nicht nur nach allen ContentTypes eines bestimmten Typs, sondern auch nach den davon abgeleiteten ContentTypes suchen, stößt diese Methode schnell an ihre Grenzen.<span id="more-1621"></span></p>
<p>Selbstverständlich könnte man über einen mehrfach verschachtelten <code>&lt;Or&gt;</code>-Operator nach vielen ContentTypes suchen - so richtig effektiv ist das aber nicht. Denn jedes Mal wenn ein ContentTyp dazu kommt, müsste man die Methoden anpassen die die Listen durchsuchen. Entsprechender Code könnte zum Beispiel relativ schnell so aussehen:</p>
<div class="listing">
<pre class="sunlight-highlight-xml">&lt;Where&gt;
    &lt;Or&gt;
        &lt;Or&gt;
            &lt;Eq&gt;
                &lt;FieldRef Name=&quot;ContentType&quot; /&gt;
                &lt;Value Type=&quot;Text&quot;&gt;Auto&lt;/Value&gt;
            &lt;/Eq&gt;
            &lt;Eq&gt;
                &lt;FieldRef Name=&quot;ContentType&quot; /&gt;
                &lt;Value Type=&quot;Text&quot;&gt;Rennwagen&lt;/Value&gt;
            &lt;/Eq&gt;
        &lt;/Or&gt;
        &lt;Or&gt;
            ...
        &lt;/Or&gt;
    &lt;/Or&gt;
&lt;/Where&gt;</pre>
</div>
<p>Hilfreich für diese Aufgabenstellung ist es, sich das Schema ins Gedächtnis zu rufen, nach dem die IDs für die ContentTypes vergeben werden: An die ID des Eltern-Typs wird die des Kind-Typs angehängt. Unter Zuhilfenahme des <code>&lt;BeginsWith&gt;</code>-Operators ist es also ohne weiters möglich, nach ContentTypes zu suchen, bei denen der Anfang der ID mit der ID des gesuchten ContentTyps übereinstimmt. Angenommen der von uns definierte ContentType "Auto" hätte die ID <code>0x0100381a9daf8b3644b6b5d36f83b2b91f83</code>, dann würde eine CAML-Abfrage, die nach "Auto" und allen davon abgeleiteten ContentTypes sucht, folgendermaßen aussehen:</p>
<div class="listing">
<pre class="sunlight-highlight-xml">&lt;Where&gt;
    &lt;BeginsWith&gt;
        &lt;FieldRef Name=&quot;ContentTypeId&quot; /&gt;
        &lt;Value Type=&quot;Text&quot;&gt;0x0100381a9daf8b3644b6b5d36f83b2b91f83&lt;/Value&gt;
    &lt;/BeginsWith&gt;
&lt;/Where&gt;</pre>
</div>
<div class="box tipp">
<p><span class="caption">Tipp:</span> Weist man einen ContentType einer Liste zu, leitet SharePoint vom zugewiesenen ContentType einen weiteren ab und weist diesen dann der Liste zu. Auch diese automatisch erzeugten ContentTypes sind so wesetlich einfacher anhand der ID zu finden!</p>
</div>
<p>Fazit: Möchte man nicht nach dem Namen der ContentTypes suchen, sondern nach dessen ID, empfiehlt es sich den Operator <code>&lt;BeginsWith&gt;</code> zu verwenden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarearbeiter.de/tipps-und-tricks/listitems-eines-bestimmten-contenttypes-auslesen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASCX: Designer funktioniert nicht</title>
		<link>http://www.softwarearbeiter.de/tipps-und-tricks/ascx-designer-funktioniert-nicht/</link>
		<comments>http://www.softwarearbeiter.de/tipps-und-tricks/ascx-designer-funktioniert-nicht/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 17:31:06 +0000</pubDate>
		<dc:creator>Markus</dc:creator>
				<category><![CDATA[Tipps und Tricks]]></category>
		<category><![CDATA[ascx]]></category>
		<category><![CDATA[UserControl]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>
		<category><![CDATA[VisualStudio-Designer]]></category>

		<guid isPermaLink="false">http://www.sharepointzone.de/?p=1211</guid>
		<description><![CDATA[VisualStudio ist ein tolles Tool wenn man ASP.NET UserControls erstellt. Leider hat der zugehörige Designer einen Fehler, der einem das Leben dabei manchmal unnötig schwer macht. Dieser Fehler kommt immer dann zum Tragen, wenn das Markup des UserControls mit einem &#60;style&#62;- einem &#60;link&#62;- oder einem &#60;meta&#62;-Element beginnt und darauf ein Web-Steuerelement mit dem Inhalt des [...]]]></description>
			<content:encoded><![CDATA[<p>VisualStudio ist ein tolles Tool wenn man ASP.NET UserControls erstellt. Leider hat der zugehörige Designer einen Fehler, der einem das Leben dabei manchmal unnötig schwer macht. Dieser Fehler kommt immer dann zum Tragen, wenn das Markup des UserControls mit einem <code>&lt;style&gt;</code>- einem <code>&lt;link&gt;</code>- oder einem <code>&lt;meta&gt;</code>-Element beginnt und darauf ein Web-Steuerelement mit dem Inhalt des UserControls folgt. Bei einem Versuch dieses Steuerelement im Designer zu bearbeiten ist alles was man sieht eine leere Seite.<span id="more-1211"></span></p>
<div class="listing">
<pre class="sunlight-highlight-xml">&lt;%@ Control Language=&quot;C#&quot; Inherits=&quot;WebApplication1.MyUserControl&quot; %&gt;
&lt;style type=&quot;text/css&quot;&gt;
p {
    color: #ff0000;
}
&lt;/style&gt;
&lt;asp:Label ID=&quot;MyLabel&quot; runat=&quot;server&quot; Text=&quot;MyLabel&quot;/&gt;</pre>
</div>
<p>Der hier gezeigte Code würde beispielsweise folgende Designer-Ansicht produzieren:</p>
<div class="image" style="width:587px;"><img style="width:587px;" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/01/screenshot_EmptyDesigner.png">
<p><strong>Abb. 2:</strong> Leerer Designer</p>
</div>
<p>Die Erklärung für dieses Verhalten ist ebenso einfach wie unbefriedigend: Der Designer wurde ursprünglich dafür konstruiert vollständige HTML-Seiten anzuzeigen - Seiten also, die sowohl über einen <code>&lt;head&gt;</code>- als auch einen <code>&lt;body&gt;</code>-Tag verfügen.  Beginnt nun das Markup mit einem <code>&lt;style&gt;</code>-, <code>&lt;link&gt;</code>- oder einem <code>&lt;meta&gt;</code>-Tag erstellt der Parser einen virtuellen <code>&lt;head&gt;</code>-Bereich um diese und alle folgenden Elemente, solage bis das er ein Element identifiziert das eindeutig dem Body einer Webseite zuzuordnen ist, wie z.B. ein <code>&lt;form&gt;</code>- oder ein <code>&lt;div&gt;</code>-Element.</p>
<p>Da eine ASCX-Datei normalerweise weder über ein <code>&lt;head&gt;</code>- noch über ein <code>&lt;body&gt;</code>-Element verfügt, verschluckt der Designer das <code>&lt;style&gt;</code>- und alle folgenden Tags weil er diese Elemente nicht eindeutig dem Body einer Webseite zuordnen kann. VisualStudio erkennt also nichts was zu rendern wäre und das Ergebnis ist ein leerer Designer.</p>
<p>Gott sei Dank gibt es allerdings den ein oder anderen Weg dieses Problem zu umschiffen. Eine Möglichkeit besteht darin, die <code>&lt;style&gt;</code>- oder <code>&lt;link&gt;</code>-Tags ans Ende des Dokuments zu verschieben. Das Layout des UserControls wird dadurch nicht beeinflusst. Ein weiterer Weg wäre den Inhalt des Steuerelements (abgesehen von den <code>&lt;style&gt;</code>- oder <code>&lt;link&gt;</code>-Tags) mit einem <code>&lt;div&gt;</code>- oder <code>&lt;span&gt;</code>-Element zu umgeben. Auch diese Maßnahme würde das Layout des Steuerelements nicht beeinflussen:</p>
<div class="listing">
<pre class="sunlight-highlight-xml">&lt;%@ Control Language=&quot;C#&quot; Inherits=&quot;WebApplication1.MyUserControl&quot; %&gt;
&lt;style type=&quot;text/css&quot;&gt;
p {
    color: #ff0000;
}
&lt;/style&gt;
&lt;div&gt;
    &lt;asp:Label ID=&quot;MyLabel&quot; runat=&quot;server&quot; Text=&quot;MyLabel&quot;/&gt;
&lt;/div&gt;</pre>
</div>
<div class="box tipp">
<p><span class="caption">Tipp:</span> Sind trotz der eben geschilderten Wege eure Steuerelemente immer noch nicht zu sehen, setzt einmal das <code>Visible</code>-Attribut des Steuerelements explizit auf <code>True</code>.</p>
</div>
<p>Vielen Dank an den <a class="external" target="_blank" href="http://blogs.msdn.com/webdevtools/archive/2008/04/27/workaround-empty-design-view-for-user-controls.aspx">Visual Web Developer Team Blog</a> der mir sowohl die Erklärung als auch die Lösung des Problems geliefert hat.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarearbeiter.de/tipps-und-tricks/ascx-designer-funktioniert-nicht/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Verwendung des DateTime-Picker-Steuerelements</title>
		<link>http://www.softwarearbeiter.de/tipps-und-tricks/verwendung-des-datetime-picker-steuerelements/</link>
		<comments>http://www.softwarearbeiter.de/tipps-und-tricks/verwendung-des-datetime-picker-steuerelements/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 17:30:15 +0000</pubDate>
		<dc:creator>Markus</dc:creator>
				<category><![CDATA[Tipps und Tricks]]></category>
		<category><![CDATA[ascx]]></category>
		<category><![CDATA[CompareValidator]]></category>
		<category><![CDATA[DateTime-Picker]]></category>
		<category><![CDATA[DateTimeControl]]></category>
		<category><![CDATA[Kalender-Steuerelement]]></category>
		<category><![CDATA[Steuerelement]]></category>
		<category><![CDATA[UserControl]]></category>
		<category><![CDATA[WebPart]]></category>

		<guid isPermaLink="false">http://www.sharepointzone.de/?p=581</guid>
		<description><![CDATA[SharePoint stellt zum Bearbeiten von Datums- und Zeitwerten ein schönes Steuerelement zur Verfügung, das DateTimeControl. Dieses Steuerelement kann man auch in eigenen UserControls oder Webparts verwenden. Das Steuer-element befindet sich im Namespace Microsoft.SharePoint.WebControls in der Assembly Microsoft.SharePoint.dll. Dieser Eintrag erläutert welche Schritte beim Einsatz dieses Steuerelements nötig sind, und was man als Entwickler dabei beachten [...]]]></description>
			<content:encoded><![CDATA[<p><img class="teaser" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/01/teaser_DateTimeControl-150x150.png" />SharePoint stellt zum Bearbeiten von Datums- und Zeitwerten ein schönes Steuerelement zur Verfügung, das DateTimeControl. Dieses Steuerelement kann man auch in eigenen UserControls oder Webparts verwenden. Das Steuer-element befindet sich im Namespace <code>Microsoft.SharePoint.WebControls</code> in der Assembly <code>Microsoft.SharePoint.dll</code>. Dieser Eintrag erläutert welche Schritte beim Einsatz dieses Steuerelements nötig sind, und was man als Entwickler dabei beachten muss.</p>
<p>Grundsätzlich gibt es zwei Möglichkeiten Steuerelemente in WebParts oder UserControls einzubinden. Zum einen kann man das gewünschte Steuerelement im Quellcode eines WepParts oder UserControls instantiieren, zum anderen kann man es direkt im Markup eines UserControls oder einer ASPX-Seite verwenden. In diesem Artikel werde ich beide Varianten kurz vorstellen und zusätzlich auf eventuelle Hürden und Fallstricke beim Einsatz des Steuerelements hinweisen.<span id="more-581"></span></p>
<div class="image" style="width:266px;"><img style="width:266px;" src="http://www.softwarearbeiter.de/wp-content/uploads/2010/01/screenshot_DateTimeControl.png">
<p><strong>Abb. 2:</strong> DateTimeControl</p>
</div>
<h3>Verwendung im Quellcode</h3>
<p>Um dieses Steuerelement in einem WebPart zu verwenden reichen ein paar kurze Zeilen Code in der <code>CreateChildControls</code>-Methode des WebParts, die das Steuerelement der ControlsCollection desselben hinzufügen:</p>
<div class="listing">
<pre class="sunlight-highlight-csharp">protected override void CreateChildControls() {
    base.CreateChildControls();
    ...
    birthdayDateTimeControl = new DateTimeControl();
    birthdayDateTimeControl.ID = &quot;birthdayDateTimeControl&quot; + UniqueID;
    this.Controls.Add(birthdayDateTimeControl);
    ...
}</pre>
</div>
<div class="box tipp">
<p><span class="caption">Tipp:</span> Beachte, dass der ID des DateTimeControls die UniqueID des WebParts in dem das Steuerelement liegt angehängt wird. Dies ist notwendig um doppelte IDs zu verhindern, sollte ein WebPart zweimal auf einer Seite instantiiert werden.</p>
</div>
<p>Braucht man die Referenz auf das Steuerelement später noch an anderer Stelle, ist es natürlich sinnvoll sich die Referenz in einer Klassenvariable außerhalb der <code>CreateChildControls()</code>-Methode zu halten.</p>
<h3>Verwendung im Markup</h3>
<p>Eine weitere Möglichkeit dieses Steuerelement zu verwenden liegt in der direkten Integration in das Markup (den HTML-Quellcode) beispielsweise eines UserControls. Damit die von SharePoint bereitgestellten Steuerelement überhaupt verwendbar werden ist zunächst ein zusätzlicher Tag-Prefix zu registrieren. Auch hier wird die oben erwähnte Assembly referenziert:</p>
<div class="listing">
<pre class="sunlight-highlight-xml">&lt;%@ Register TagPrefix=&quot;SharePoint&quot; Namespace=&quot;Microsoft.SharePoint.WebControls&quot;
Assembly=&quot;Microsoft.SharePoint, Version=12.0.0.0,
          Culture=neutral, PublicKeyToken=71e9bce111e9429c&quot; %&gt;</pre>
</div>
<p>Anschließend kann das Steuerelement einfach ins Markup des UserControls eingebunden werden. Folgend beispielhaft der Code um das Steuerelement innerhalb einer Tabelle zu verwenden:</p>
<div class="listing">
<pre class="sunlight-highlight-xml">&lt;%@ Register TagPrefix=&quot;SharePoint&quot; Namespace=&quot;Microsoft.SharePoint.WebControls&quot;
Assembly=&quot;Microsoft.SharePoint, Version=12.0.0.0,
          Culture=neutral, PublicKeyToken=71e9bce111e9429c&quot; %&gt;</pre>
</div>
<div class="box caution">
<p><span class="caption">Achtung:</span> Verändert man die Eigenschaften des Steuerelements in der Design-Ansicht verändert VisualStudio das dahinterliegende Markup und ergänzt automatisch die zur Anzeige des DateTimeControls verwendeten Steuerelemente. Diese müssen vor dem Ausliefern des UserControls wieder aus dem Markup entfernt werden, da das Steuerelement sonst nicht korrekt funktioniert.</p>
</div>
<p>Im Gegensatz zum oben erläuterten Einsatz des Steuerelements über den Quellcode brauchen wir hier keine Sorge zu tragen, dass die ID des Steuerelementes seitenweit eindeutig ist. Diese Aufgabe nimmt SharePoint uns dankenswerter Weise ab. Nichtsdestotrotz muss die ID des Steuerelementes innerhalb des UserControls immernoch eindeutig sein!</p>
<p>Netterweise stellt das DateTimeControl bereits einen RequiredFieldValidator zur Verfügung, um zu prüfen ob der Benutzer einen Wert in das Feld eingetragen hat oder nicht. Möchte man allerdings z.B. die Werte zweier DateTimeControls miteinander vergleichen muss man einen kleinen Umweg gehen. Intern werden für jedes DateTimeControl eine TextBox für das Datum und zwei DropDownBoxen für die Stunden und Minuten erzeugt. Die IDs dieser Controls entsprechen jeweils der ID des DateTimeControls mit einem Anhang. Die TextBox für das Datum hat den Anhang "Date", die DropDownBox für die Stunden den Anhang "DateHours" und die für die Minuten den Anhang "DateMinutes".</p>
<p>Auf diese Controls kann nun recht einfach zugegriffen werden. Da das anzusprechende Steuerelement aber ein Kindelement des DateTimeControls ist, muss dessen Index dem Validator - getrennt durch ein Dollar-Zeichen ($) ebenfalls mitgegeben werden. Für das Steuerelement "FirstControl", dessen Datumswert mit dem des Steuerelements "SecondControl" verglichen werden soll, sähe z.B. ein Validator zum Vergleichen zweier Datumswerte folgendermaßen aus:</p>
<div class="listing">
<pre class="sunlight-highlight-xml">&lt;asp:CompareValidator
    ID=&quot;MyValidator&quot;
    ControlToValidate=&quot;FirstControl$FirstControlDate&quot;
    ControlToCompare=&quot;SecondControl$SecondControlDate&quot;
    Type=&quot;Date&quot;
    Operator=&quot;GreaterThan&quot;
    runat=&quot;server&quot;
    ErrorMessage=&quot;...&quot;
&lt;/asp:CompareValidator&gt;</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarearbeiter.de/tipps-und-tricks/verwendung-des-datetime-picker-steuerelements/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Default-Werte von Spalten in ListTemplates</title>
		<link>http://www.softwarearbeiter.de/tipps-und-tricks/default-werte-von-spalten-in-listtemplates/</link>
		<comments>http://www.softwarearbeiter.de/tipps-und-tricks/default-werte-von-spalten-in-listtemplates/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 20:02:08 +0000</pubDate>
		<dc:creator>Markus</dc:creator>
				<category><![CDATA[Tipps und Tricks]]></category>
		<category><![CDATA[Default-Wert]]></category>
		<category><![CDATA[DefaultValue]]></category>
		<category><![CDATA[Feature-Definition]]></category>
		<category><![CDATA[ListTemplate]]></category>
		<category><![CDATA[schema.xml]]></category>
		<category><![CDATA[SharePoint 2007]]></category>

		<guid isPermaLink="false">http://www.alphamarkus.de/sharepointzone/?p=1</guid>
		<description><![CDATA[Willkommen in meinem Blog rund um das Thema "SharePoint, das Universum und der ganze Rest". In diesem Blog werde ich regelmäßig Tipps und Tricks sowie das eine oder andere Tutorial rund um das Thema SharePoint veröffentlichen. Und ich will auch gar nicht lange um den heißen Brei herumreden, sondern gleich mit einem kleinen Tipp einsteigen. [...]]]></description>
			<content:encoded><![CDATA[<p>Willkommen in meinem Blog rund um das Thema "SharePoint, das Universum und der ganze Rest". In diesem Blog werde ich regelmäßig Tipps und Tricks sowie das eine oder andere Tutorial rund um das Thema SharePoint veröffentlichen.</p>
<p>Und ich will auch gar nicht lange um den heißen Brei herumreden, sondern gleich mit einem kleinen Tipp einsteigen. Definiert man in einer Feature-Definition eine eigene Liste und möchte einer dazugehörigen Spalte einen Standard-Wert verpassen hat man auf den ersten Blick eine Menge Möglichkeiten. Aber nur weil einige der XML-Tags Attribute wie DefaultValue zulassen heißt das noch nicht, dass der dann auch später von SharePoint so verstanden wird.</p>
<p>Die Lösung einer Spalte einen Standardwert zuzuweisen liegt in der Datei <code>schema.xml</code> eines Listen-Templates. um hier einer Spalte einen Default-Wert zuzuweisen reicht es innerhalb des <code>&lt;Field&gt;</code>-Tags den <code>&lt;Default&gt;</code>-Tag zu verwenden. Beispiel:</p>
<div class="listing">
<pre class="sunlight-highlight-xml">&lt;Field ID=&quot;...&quot; Name=&quot;...&quot; ...&gt;
    &lt;Default&gt;Mein Standardwert&lt;/Default&gt;
&lt;/Field&gt;</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.softwarearbeiter.de/tipps-und-tricks/default-werte-von-spalten-in-listtemplates/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

