Hallo zusammen
Ich entwickle gerade eine Webapplikation, in welcher sowohl BasicAuthentication sowie auch Forms Authentication verwenden muss (abhängig vom verwendeten IHttpHandler). Wie gehe ich da am besten vor, in der Web.config kann ich IMHO nur entweder oder täusche ich mich da?
Beste Grüsse
Hallo zusammen
Ich habe eine eigene ViewEngine basierend auf der RazorViewEngine geschrieben und habe dabei folgendes Problem entdeckt:
Ich habe eine View, in welcher ich so etwas mache:
@model TEvent
@Html.Partial("ViewTile",Model.ContactPerson)
Das Problem ist nun in meiner ViewEngine:
public override ViewEngineResult FindPartialView(ControllerContext Context,string ViewName,bool UseCache) {
return base.FindPartialView(Context,ComputeBestMatch(Context,ViewName),UseCache);
}
Und zwar zeigt Context.Controller.ViewData.Model immer auf das Model der ParentView, also nicht auf das Model, welches ich der PartialView übergeben habe. Model ist in dem Falle immer TEvent, ganz egal was ich @Html.Partial für ein Model übergebe. Ich benötige jedoch in der ViewEngine natürlich das Model, welches der PartialView übergeben wurde, um die korrekte PartialView zu ermitteln?
Was mache ich falsch?
Besten Dank für eure Zeit 😃
Hallo zusammen
Ich habe zwei Methoden in einem Controller, eine für ein GET Request (wenn das Formular das erste Mal angezeigt wird) und eines für den POST Request (wenn der Benutzer auf senden geklickt hat und auch tatsächlich Daten gesendet wurden). Nun ist es aber so, dass bereits beim ersten Anzeigen des Formulars überall rote Warnhinweise stehen (weil das Model ungültig ist). Dies konnte ich nun lösen, indem ich ModelState.Clear() in der GET Methode definiert habe. Aber gibt es da nicht einen sinnvolleren Ansatz?
Beste Grüsse
Samuel
Hallo zusammen
Gibt es eine Möglichkeit, einer Funktion, welche einen MvcHtmlString verlangt, einen CSHtml Code zu übergeben?
Bspw.
@Html.FunctionTakesMvcHtmlString(@{
<h1>Hua</h1>
<div>@Hua</div>
})
Beste Grüsse
Samuel
Hallo zusammen
Ich kann ja die HTML Display und EditorTemplates überschreiben, aber was ich auch machen müsste, wäre, den Rahmen selbst zu überschreiben:
<div class="editor-field">??EditorTemplateCode??<span class="field-validation-error">Bitte geben Sie Ihren Vornamen ein</span></div>
Was ich nun aber ändern möchte, wäre das <div class="editor-field"> usw..
Wie mache ich das?
Beste Grüsse
Samuel
Hallo zusammne
Ich muss aus einer bestehenden Url aus einem HttpRequest eine neue URL basteln, welche identisch zur alten, jedoch ohne einen bestimmten URL Parameter ist. Gibt es hierfür einen eleganten Weg? Meine aktuelle Lösung ist IMHO ein bisschen krakelig :-p
StringBuilder RedirectUrl = new StringBuilder(Request.Path);
if(Request.QueryString.Count > 1){
RedirectUrl.Append('?');
foreach (string Key in Request.QueryString.AllKeys){
if(Key != "ROSessionID")
RedirectUrl.AppendFormat("{0}={1}&",Key,Request.QueryString[Key]);
}
}
Response.Redirect(RedirectUrl.ToString().TrimEnd('&'));
Beste Grüsse
@Abt
Ich muss es natürlich noch präzisieren, ich meinte mehrere Requests von demselben Benutzer können nicht parallel ausgeführt werden, weil sonst die Session Daten korrumpiert werden könnten. ASP wird solche Request nacheinander ausführen, was einen enormen Performanceverlust nach sich ziehen kann (und in unserem Fall auch tut).
Also ich hab einen Applikationesserver mit einem RPC Interface, welches eine TCP/IP Verbindung erfordert. Nun muss sich die Webapplikation sagen wir mal (100x) als Client bei diesem Applikationsserver anmelden und die TCP/IP Verbindungen offenhalten und verwalten. Wenn nun ein WebRequest reinkommt, welches Daten von diesem Applikationsserver benötigt, soll eine bestehende solche TCP/IP Verbindung aus diesem Pool benutzt werden (anstatt jedes Mal eine neue Verbindung herzustellen und anschliessend wieder zu beenden). Der Zugriff auf diesen Pool muss aber natürlich synchronisiert werden, weil ansonsten bspw. plötzlich mehrere (parallele) Webrequests dieselbe TCP/IP Verbindung zum Applikationsserver benutzen wollen, was nicht vorhersehbare Folgen hätte.
Hallo zusammen
Ich habe hier gerade folgende Situation:
Meine ASP .NET MVC3 Applikation muss einen Pool an wiederverwendbaren TCP Verbindungen verwalten, welche für den Datenzugriff auf das Backend verwendet werden. Nun ist es ja so, dass bspw. bei der Verwendung von Sessions immer nur ein Request zur gleichen Zeit bearbeitet werden kann (also nicht parallel) was in unserem Fall eine nicht hinnehmbare Performance zur Folge hat. Wenn nun aber einzelne (parallele) Request eine solche TCP Verbindung benötigen, muss dessen Zugriff ja synchronisiert werden. Ich frage mich nun, ob es eine Möglichkeit gibt, dies zu verhindern, bspw. durch den Einsatz von einem bestimmten Filder oder ähnlichem?
Beste Grüsse
Hallo zusammen
Ich muss aus einem Controller heraus einen Actionlink erstellen und wollte hierfür HtmlHelper.ActionLink verwenden. Hierfür habe ich auch den Namespace System.Web.Mvc.Html eingebunden aber leider bekomme ich dennoch eine Fehlermeldung, dass es diese Methode (ActionLink) nicht gibt 😕
Weis vielleicht jemand von euch, was ich falsch mache?
Beste Grüsse
Hallo zusammen
Ich habe relativ viel Initialisierungcode (bspw. Ninject) welcher beim Application_Start ausgeführt wird. Jtzt habe ich allerdings bemerkt, dass nach einem Neukompollieren der Code in Application_Start nur dann ausgeführt wird, wenn ich vorher noch die Web.config Datei verändert hatte (und selbst dann nicht immer). Wie bringe ich Visual Studio und oder IIS dazu, bitte die Applikation neu zu starten, wenn ich den Code verändert? Wie kann er das überhaupt NICHT neu starten?
Beste Grüsse
Ist ersteres, weil wenn ich zweiteres mache ist das ViewModel null
Hab das jtzt mal geänder. Das Problem ist einfach folgendes:
@if(Model != null && !ViewData.ModelState.IsValid){
<td>@Html.ValidationMessageFor(m => m.Username)</td>
}
Muss das so kompliziert sein? Gibt es keine Möglichkeit, dass ValidationMessageFor kein Fehler macht, wenn Model = null ist?
hmm dann kommt der Fehler aber auch nicht mehr, NACHDEM ich ungültige Daten per POST gesendet habe.
P.S.
Mit den ValidationMessageFor habe ich übrigens genau dasselbe Problem.
Hallo zusammen
Ich bin gerade dabei ein erstes Projekt mit ASP .NET MVC3 zu realisieren und habe dazu auch schon eine erste Frage :-p
Ich habe ein Formular in welchem ich Fehler mit @Html.ValidationSummary() anzeige. Nun ist es aber so, dass diese Fehler auch schon bereits beim ersten Visit des Formulars angezeigt werden (also bevor überhaupt Daten per POST Befehl an den Webserver gesendet wurden). Wie kann ich das verhindern? (Ich könnte es natürlich problemlos ausprogrammieren, aber ich bin sicher, MVC hat da bereits einen Mechanismus?
Vielen Dank im Voraus und beste Grüsse
Hi Abt
Danke vielmal für deine schnelle Antwort, genau auf sowas hatte ich gehofft! 😃
Hallo zusammen
Ich bin neu mit ASP .Net MVC und habe immer wieder ein bisschen dieselben Probleme mit Pfaden, sobald eine Webapplikation als Anwendung innerhalb einer Website läuft. bspw. unter http://localhost/MyApp anstatt nur http://localhost. Und zwar ist das generelle Problem in einem solchen Fall, dass absolute Pfade nicht mehr funktionieren, bspw. /Content/mypic.jpg wird dann nicht mehr gefunden. Zwar habe ich hierfür eine Lösung:
Anstalle von
<img src="/Content/Icons/parent.gif" width="16" height="16"/>
schreibe ich nun überall
<img src="@Request.ApplicationPath.TrimEnd('/')/Content/Icons/parent.gif" width="16" height="16"/>
aber ich meine Jungs.... Echt jetzt? Das kann doch wohl nicht die Lösung sein oder?
Wie geht ihr mit diesem Problem um resp. was ist der offizielle "WayToGo"??
Herzlichen Dank im Voraus und beste Grüsse
Hallo talla
sowas:
<LineSegment Point="{Binding ElementName=NameOfCanvas, Path=Right-25},0"/>
Hallo zusammen
Ich bin gerade dabei WPF zu erlernen und habe diesbezüglich eine ganz einfach Frage, auf die ich aber partout keine Antwort finden kann. Folgende Aufgabe: Zeichne eine Linie von 10,10, bis Canvas.Right-10,10.
Wie mache ich denn das jtzt? Ich habs mit DataBindings versucht, aber das scheint nicht zu klappen 😦
Hallo zusammen
Ich versuche, die lokale IPv4 Adresse der Standardschnittstelle zu ermitteln, was auch sehr gut funktioniert, solange IPv6 nicht auf dem Computer installiert ist. Ich frage mich nun, wie es möglich ist eine IPv4 Adresse von einer IPv6 Adresse zu unterscheiden, ohne diese parsen zu müssen. Weis jemand, wie man dies bewerkstelligen könnte?
// declare local variables
UnicastIPAddressInformation uia = null;
// start a loop for walking each available network interface
foreach(NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces()){
// check if the current network interface is up
if(nic.OperationalStatus == OperationalStatus.Up){
// determine the first available address of the current interface and escape the loop
uia = nic.GetIPProperties().UnicastAddresses[0];
break;
}
}
Mfg Ishildur
@marsgk
Es scheint so, als ob Thread.Interrupt() in diesem Fall nicht funktionieren würde. Kann es sein, dass Socket.Accept nicht interruptable ist?
Sorry, da habe ich mich verschrieben. Ich meinte natürlich: Für ein führendes Minuszeichen 😁
Eine Frage hätte ich noch:
Kann man auf demselben Socket in einem Thread Receive und parallel dazu in einem zweiten Thread Send aufrufen? Und werden diese Aktionen dann auch tatsächlich parallel ausgeführt (also nicht so, dass der thread von send in den wait zustand gesetzt wird, bis der read thread seine arbeit abgeschlossen hat)?
Mfg Samuel
Hallo zusammen
Ich habe eine Frage zu String.Format, welche mich bereits seit längerem beschäftigt (irgendwie hatte ich es aber schliesslich immer wieder vergessen 😉.
Es ist ja möglich, Platz für führende Nullstellen zu reservieren: bspw. {0:x2}
Gibt es analog auch eine Möglichkeit, Platz für führende Nullstellen zu reservieren?
Mfg Samuel
Hehe 🙂 Sitzt du auch gerade in einer Vorlesung? 😄
Hehe, du meinst, ich sollte den Socket im Aufrufenden Thread schliessen (nicht im Workerthread, welche Socket.Accept aufruft und anschliessend am warten ist?
Das verstehe ich jetzt nicht:
In der offiziellen Doku steht dazu folgendes:
ThreadInterruptedException wird im unterbrochenen Thread ausgelöst, jedoch erst, nachdem der Thread blockiert wurde. Wenn der Thread nie blockiert wird, wird die Ausnahme nicht ausgelöst. Daher kann der Thread möglicherweise ohne Unterbrechung abgeschlossen werden.
Also wenn ich das richtig verstehe, kann ich damit einen laufenden Thread nicht unterbrechen?
Abgesehen davon, selbst wenn es funktionieren würde, dann hätte ich doch dasselbe Problem wie bei Thread.Abort()?
Bei Thread.Abort() wird im entsprechenden Thread ThreadAbortedException und bei Thread.Interrupt() ThreadInterruptedException ausgelöst. Beides wird allerdings nicht funktionieren, wenn sich jener Thread gerade im finalize block befindet?
Hallo zusammen
Ich bin relativ neu in der Entwicklung von parallelen Anwendungen und habe hierzu mal eine ganz Grundlegende Frage, welche viele meiner gegenwärtigen Probleme lösen könnte:
Ich beschäftige mich gerade mit dem Problem, wie man Threads "sicher" beenden kann. Normalerweise habe ich eine bool'sche volatile Variable welche ich im Workerthread an verschiedenen Prüfe und gegenenfalls den Thread von innen heraus beende, indem ich bspw. mit break aus einer Schleife springe oder so ähnlich. Mit dieser Technik habe ich bisher sehr gute Erfahrungen gemacht, doch gibt es Fälle, wo der gesamte Thread auschliesslich eine blocking methode enthält. Ein Beispiel hierfür wäre Socket.Accept. Hier kann ich nicht eifach ein Flag prüfen, denn sobald ich Socket.Accept aufgerufen habe, geht der Programmfluss in diesem Thread nicht weiter, bis ein engehende Verbindung zustande gekommen ist. Aber bei Socket.Connect dauert es dann bis zu 30 sekunden, bis der entsprechende Thread dann auch wirklich schliesst.
Meine Frage ist nun, wie kann ich solche Threads "sicher" beenden (das heisst, sicherstellen, dass alle Resourcen freigegeben werden) ? Thread.Abort soll ja keine gute Variante sein, weil sich der ensprechende Thread zum gegebenen Zeitpunkt im finalize block befinden könnte, wodurch dieser dann nicht bis zum Ende ausgeführt wird...
Mfg Samuel
Etwas ist mir jetzt doch aufgefallen:
Wenn ich die IP von www.google.de 74,125,43,103 anstatt diejenige von meinem Fileserver angebe, dann passiert der Fehler nicht..
Mir kommt es so vor als ob er keinen Separaten Thread für das Callback Delegate verwendet, falls er innerhalb einer sehr sehr kurzen Zeit eine Verbindung aufbauen kann...
OK, nun ist mir aufgefallen, dass es von Zeit zu Zeit geht. Manchmal sind es unterschiedliche Threads => dann funktionierts. Aber oft ist es derselbe Thread und dann funktionierts natürlich nicht. Die Frage ist nun, warum das Delegate oft in demselben Thread aufgerufen wird...
So geschafft... Dieser Code erzeugt denselben Fehler, allerdings tritt der Fehler nur im LAN mit einem sehr schnellen Netzwerk auf.
using System;
using System.Net;
using System.Net.Sockets;
namespace Fuck{
class Program{
private object obLoc;
private bool bErr;
static void Main(string[] args){
new Program();
Console.In.Read();
}
public Program(){
this.obLoc = new object();
lock(this.obLoc) {
Socket s = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
s.Bind(new IPEndPoint(new IPAddress(new byte[] { 192,168,2,6 }),0));
s.Ttl = 10;
s.BeginConnect(new IPAddress(new byte[] { 192,168,2,8 }),80,this.HandleClient,null);
if(this.bErr) Console.WriteLine("Schaaaaade, Windooooooof... Schaaaaade.....");
}
}
private void HandleClient(IAsyncResult Result){
lock(this.obLoc) {this.bErr = true;}
}
}
}
Habe ich gemacht: Ist dieselbe ID
Ich hatte schon daran gedacht, ob BeginConnect vielleicht das Delegate in demselben Thread aufruft, aber dann hatte ich dies hier entdeckt in der offiziellen Doku entdeckt:
When your application calls BeginConnect, the system will use a separate thread to execute the specified callback method, and will block on EndConnect until the Socket connects successfully or throws an exception.
Hallo zusammen
Ich habe ein Problem mit einem Lock: irgendwie scheint das Mutual Exclusion bei C# nicht zu funktionieren? 8o
Erste Codeschnipsel:
// make sure no other thread is currently manipulating the sockets
lock(this.obLoc){
// create a server socket and listen for incoming connection attempts
this.skSrv = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//this.skSrv.Bind(new IPEndPoint(this.ipLoc,this.nmPrt));
//this.skSrv.Listen(1);
//this.skSrv.BeginAccept(this.HandleServer,null);
// try to establish a client - connection simultaneously
this.skDta = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
this.skDta.Bind(new IPEndPoint(this.ipLoc,0));
this.skDta.Ttl = 10;
this.skDta.BeginConnect(this.ipRmt,this.nmPrt,this.HandleClient,null);
// WTF: Zwischen diesen beiden Zeilen wird der komplette Code aus dem zweiten Teil ausgeführt... ?(
// adjust the status
this.stSta = "Connecting to "+this.ipRmt+":"+this.nmPrt;
}
Zweites Codeschnipsel:
//make sure no other thread is currently manipulating the sockets
lock(this.obLoc){
// check if no server connection has been established in the meantime
if(this.skSrv != null){
// open a try - statement as an exception may occure
try{
// try to end the current client connection process
this.skDta.EndConnect(Result);
// close and set null the server - socket immediatly
this.skSrv.Close();
this.skSrv = null;
// adjust the status
this.stSta = "Connected with "+this.ipRmt+":"+this.nmPrt+" as Client";
}
// a socket - exception has occurred
catch(Exception exp) {
// make another connection - attempt
this.skDta.BeginConnect(this.ipRmt,this.nmPrt,this.HandleClient,null);
}
}
}
Leider springt der Code munter von einem Lock ins andere und zurück, wie ist das Möglich?
Mfg Samuel
Hallo zusammen
Ich suche verzweifelt nach einer Möglichkeit um den Netzwerkadapter zu einer bestimmen lokalen IP Adresse zu ermitteln. Hat jemand von euch eine Idee, wie man dies am einfachsten bewerkstelligen könnte?
Vielen Dank und Gruss
Samuel
das hier ist ein böses und sehr verwirrendes spiel mit referenz und wertetypen.
Hehe, dachte ich mir schon, leider wird die Prüfung mit solchen Sachen vollgespickt sein 😉
Wieso wird denn nun der Wert nicht zugewiesen, wenn ich vorher explizit in ein Interface caste? Das verstehe ich nun echt nicht X(
Hallo zusammen
Ich bereite mich gerade auf eine Prüfung in C# vor und leider gibt es in diesem Zusammenhang noch einige Unklarheiten. Ich habe folgenden Beispielcode:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace BFH
{
public class BoxingUnboxing {
interface ISomething {
string TheString {
get;
set;
}
}
class MyClass : ISomething {
public string TheString {
get;
set;
}
}
struct MyStruct : ISomething {
public string TheString {
get;
set;
}
}
public static void Test() {
ISomething i;
MyStruct s = new MyStruct { TheString = "Hello " };
MyClass c = new MyClass { TheString = "World!" };
i = s;
i.TheString += c.TheString;
Console.WriteLine("i: {0}", i.TheString); => => i: Hello World!
Console.WriteLine("s: {0}", s.TheString); => s: Hello
i = c;
i.TheString = s.TheString + c.TheString;
Console.WriteLine("i: {0}", i.TheString); => => i: Hello World!
Console.WriteLine("c: {0}", c.TheString); => c: Hello World!
((ISomething)s).TheString = "Ooops!";
((ISomething)c).TheString = " Wow!";
Console.WriteLine("s: {0}", s.TheString); => s: Hello
Console.WriteLine("c: {0}", c.TheString); => c: Wow!
}
}
}
Wieso ist nun die Ausgabe des letzten s.TheString "Hello" und nicht "Ooops!" ?
Sehe ich das richtig, dass man EndConnect nur dann aufrufen sollte, wenn der Verbindungsaufbau erfolgreich was?
Hallo nocheinmal
Mir ist noch etwas eingefallen, was mir nicht so ganz klar ist:
Was passiert eigentlich, wenn ich BeginSend aufrufen und zur gleichen Zeit versucht mir der andere Host ebenfalls etwas zu senden? Gehen die Daten dann verloren?
Lg Ishildur
Hallo zusammen
Ich habe eine Fragen bezüglich der in der .NET Klassenbibliothek vorhandenen Sockets:
Was ist der Unterschied zwischen BeginConnect und ConnectAsync? Ich habe keine Antwort in der MSDN Dokumention auf diese Frage gefunden ?!?
Ich arbeite gerade an einem Studienprojekt und muss hierfür eine Softwarekomponente schreiben, welche eine TCP/IP - Verbindung zu einem anderen Rechner herstellt. Das besondere dabei ist nun, dass es für den Benutzer transparent sein soll, ob seine Applikation nun als Client oder als Server fungiert. Ich habe mir hierfür folgendes vorgestellt:
Nachdem der Benutzer die IP des Hosts, mit welchem er sich verbinden möchte, eingetippt hat, erstelle ich auf der einen Seite einen Serversocket, der auf eingehende Verbindungen des Partners hört und versuche aber gleichzeitig, eine Verbindung mit diesem aufzubauen. Derjenige, der zuerst eine Verbindung hergestellt hat (Server oder Client-Socket) wird also verwendet und der andere wieder geschlossen.
Ist dies eine sinnvolle Vorgehensweise oder macht man dies normalerweise anders?
Lg Ishildur
Also ich hatte soeben gelesen, dass man in Office VB - Makros aufzeichnen kann. Hei klasse Sache, dachte ich mir, ich veränderä einfach die entsprechende Eigenschaft, welche ich mit C# auslesen möchte und zeichne das Ganze aus, dann weiss ich, wo diese Daten gespeichert sind. Ich kann zwar kein VB aber ich werde sicher in der Lage sein, den entsprechenden Code zu übersetzen.
Also los:
Tools -> Makro -> Makro aufzeichnen
Meine UML Class doppelklicken, ein Attribut und eine Operation hinzufügen
OK
Makro beenden
Tools -> Makro -> Makros -> Bearbeiten
Aber was finde ich vor: Eine leere Sub Procedure....
Also langsam fange ich mich doch an, ein wenig zu fragen...
Wenn ich meine UML Class verschiebe, dann erscheint der Code schliesslich, wenn ich das entsprechende Makro bearbeite. Auch sämtliche Daten, welche in den Cells stehen. Aber die Attribute und Eigenschaften werden einfach nicht aufgezeichnet.
Soll das etwa heissen, dass man auf diese Daten schlicht nicht zugreifen kann? Wie soll man dann bitte schön ein Reverse - Engineering machen??? Ich kann offenbar noch nicht einmal abfragen, ob eine UML Class als "Abstract" deklariert wurde...
Also ich hoffe doch sehr, dass ich damit falsch liege?
Lg Ishildur
Also diese Daten müssen definitiv an einem anderen Ort drinn stehen. Gibt es eine Möglichkeit, Daten mit einem Shape zu "verknüpfen" oder sowas ähnliches?
Hallo zusammne
Es ist wie verhext, ich habe mir nun eine Dumping - Funktion geschrieben, um ein entsprechendes Visio - Shape zu analysieren, aber ich kann die gesuchten Daten einfach partout nicht finden... 🙁
Wo könnte man denn noch danach suchen?
// -------------------------------- method "Dump_VisioShape" --------------------------------
private void Dump_VisioShape(Visio.Shape shp,String strNme,StreamWriter stmOut,bool bTop){
// check if this was the start of the recursion
if(bTop){
// create a new file - stream and write the html - header
stmOut = new StreamWriter(new BufferedStream(new FileStream("shape_dump.html",FileMode.Create)));
stmOut.WriteLine("<html>\n<head>\n<title>Shape: "+shp.NameU+"</title>\n</head>\n<body>\n<table border=\"1\" style=\"font-size:8pt\">");
stmOut.WriteLine("<tr><th>Eigenschaft</th><th>Wert</th></tr>");
}
// write general information about the current shape
stmOut.WriteLine("<tr><td colspan=\"2\" style=\"background-color:Gray\">"+(strNme = !String.IsNullOrEmpty(strNme) ? " -> " : "")+shp.NameU+"</td></tr>");
stmOut.WriteLine("<tr><td>Data1</td><td>"+(!String.IsNullOrEmpty(shp.Data1) ? shp.Data1 : "null")+"</td></tr>");
stmOut.WriteLine("<tr><td>Data2</td><td>"+(!String.IsNullOrEmpty(shp.Data2) ? shp.Data2 : "null")+"</td></tr>");
stmOut.WriteLine("<tr><td>Data3</td><td>"+(!String.IsNullOrEmpty(shp.Data3) ? shp.Data3 : "null")+"</td></tr>");
stmOut.WriteLine("<tr><td>ID</td><td>"+shp.ID.ToString()+"</td></tr>");
stmOut.WriteLine("<tr><td>ID16</td><td>"+shp.ID16.ToString()+"</td></tr>");
stmOut.WriteLine("<tr><td>Name</td><td>"+shp.Name+"</td></tr>");
stmOut.WriteLine("<tr><td>NameID</td><td>"+shp.NameID+"</td></tr>");
stmOut.WriteLine("<tr><td>NameU</td><td>"+shp.NameU+"</td></tr>");
stmOut.WriteLine("<tr><td>Text</td><td>"+(!String.IsNullOrEmpty(shp.Text) ? shp.Text : "null")+"</td></tr>");
// start a loop for all sections
for(short i=0;i<25;++i){
// check if the current sectione exists
if(shp.get_SectionExists(i,0) != 0){
// create a new subtable for the current section
stmOut.WriteLine("<tr><td colspan=\"2\"><table border=\"1\" style=\"font-size:8pt\">");
// start a loop for walking each row
for(short k=0,c=shp.get_RowCount(i);k<c;++k){
// create a new row
stmOut.Write("<tr>");
// start a loop for walking each column
for(short l=0;shp.get_CellsSRCExists(i,k,l,0) != 0;++l){
// determine the current cell
Visio.Cell cel = shp.get_CellsSRC(i,k,l);
// write the current cell to the html - file
stmOut.WriteLine("<td><table border=\"1\" style=\"font-size:8pt\">");
stmOut.Write("<tr><td>Name</td><td>"+cel.Name+"</td></tr>");
stmOut.Write("<tr><td>LocalName</td><td>"+cel.LocalName+"</td></tr>");
stmOut.Write("<tr><td>Result</td><td>"+cel.get_ResultStr(VisUnitCodes.visNoCast)+"</td></tr>");
stmOut.WriteLine("</table></td>");
}
// close the current row
stmOut.Write("</tr>");
}
// close the current section
stmOut.WriteLine("</table></td></tr>");
}
}
// call this entire procedure recursively for alls childs and their childs and...
foreach(Visio.Shape shp2 in shp.Shapes) this.PrintShape(shp2,strNme,stmOut,false);
// check if this was the start of the recursion
if(bTop){
// close the table, flush the content of the buffer and close the stream
stmOut.WriteLine("</table>\n</body>\n</html>");
stmOut.Flush();
stmOut.Close();
}
}
// ------------------------------------------------------------------------------------------