Hallo,
ich denke du bist auf dem richtigen weg. Versuch mal nach jeder Änderung der Datenbank die Abfrage neu zu stellen, dann müsstest Du immer die aktuellen Daten erhalten. Vielleicht fehlt Dir aber auch nur noch ein DataTable.AcceptChanges().
Du kannst ales mögliche auslagern, entweder in einer oder in mehreren Assemblies. Zur Stukturierung innerhalb der Assemblies dienen die Namespaces. Es empfiehlt sich, alle Klassen usw. einer Assembly in einen gemeinsamen Namespace zu packen.
Wenn Du eine Assembly erstellt hast, kannst Du Sie unter "Verweise" eintragen.
Du kannst auch Projekte, die sich in derselben Mappe befinden, unter Verweise referenzieren.
Wenn die Assemblies richtig in Deinem Projekt referenziert sind, kannst Du ganz normal über die Namespaces auf die Klassen zugreifen zugreifen, wie bei anderen dotnet-dlls auch.
Das liegt an dengeschweiften Klammern im Javascript. Diese gelten ja als Steuerzeichen für denFormat-Befehl. Du musst doppelte geschweifte Klammern machen, um das zu escapen.
String.Format("myFunction(){{ Hier könnte Code stehen oder {0} erstezt werden... }}","irgendetwas");
gibt folgenden String:
myFunction(){ Hier könnte Code stehen oder irgendetwas erstezt werden... }
hmm... wo kommt die Eingabezeichenfolge denn her? Vielleicht ist das auch irgendein Codierungsproblem. Oder kannst Du mal in etwa die echte Zeichenfolge posten?
Wenn Du t zuerst auf null stellst, passiert genau dasselbe, durch die Zuweisung von null wird das Objekt auch nicht zerstört.
Aber da wir hier mit "Managed Code" zu tun haben, macht das auch garnix. Wenn das Objekt nirgendwo mehr referenziert ist, räumt es irgendwann die Garbage-Collection weg.
Wenn Du das Objekt selbst explizit zerstören willst, solltest Du Dir mal das IDisposable-Interface ansehen.
Ich bin mir nicht sicher, aber bielleicht wird der DataGridView nach der Zuweisung des neuen DataSet einfach nicht neu gezeichnet. Dann könnte ein dgv.Invalidate() helfen.
Das ist immer dann so, wenn Du eine Variable nicht zusammen mit der Deklaration initialisieren kannst. Wenn Du also im gleichen Aufruf deklarierst und zuweist, geht das auch bei Arrays:
int[] test = new int[]{1,2,3,4};
Wenn die Zuweisung erst nach der Deklaration erfolgt, muss es in einer Methode geschehen.
Sowas geht. Dazu muss auf dem Server, auf dem der IIS läuft, der RemoteDebugger installiert werden und laufen, ist mit auf der VS2005 CD. Dann kannst Du über das Debug-Menü von Deinem PC aus Dich auf den Server verbinden. Mehr dazu unter "RemoteDebugger" im Google.
lock(var){...} ist eine Blockanweisung, wenn die geschweifte Klammer geschlossen wird, ist die Variable wieder frei. Ein "unlock" gibts meines Wissens nicht.
Ich würde das so machen:
Das Interface IRotatableAds
public AdType Type
{
get;
}
void BuildNewAd(RotateAds myControl);
Die Implementierung von BuildNewAd erfolgt dann in den DataSet-Klassen und kann die Funktion von GetNewAd() mit der zum jeweiligen DataSet passenden Formatierung der übergebenen Control kombinieren.
Die DataSets müssen in der Implementierung der Property "Type" den jeweils passenden Typ zurückliefern.
Dann kannst Du eine Liste aller DataSets erstellen (evtl. static), und zwar als IRotatableAds, also wie folgt:
public static List<IRotatableAds> adsList;
Dieser Liste fügst Du die DataSets durch AdsList.Add(dataSet) an.
Dann kannst Du schließlich in deiner Control folgendes tun:
In der Global.asax kannst du einen Handler für das Ereignis HttpApplication.PostRequestHandlerExecute schreiben. Google hierzu mal nach "global.asax" und "PostRequestHandlerExecute". Da müsstest du dann irgendwie auf die gerenderte Page zugreifen können - notfalls über den Response-Stream.
Wenn das alles auf einem IIS läuft, kannst du so vorgehen, wie ich oben gepostet habe. Der asp.net-Prozess stellt dem Webservice die Appliation-Collection zur Verfügung. So eine Collection gibts einmal für jeden Webservice im IIS. Da der asp-Prozess weiterlebt und nicht beendet wird ausser wenn Du den IIS beendest, ist diese Collection dann quasi für alle Threads statisch.
Andersrum gesagt: Es werden zwar 2 Instanzen des Webservice erdtellt, diese laufen aber im selben Prozesss. Dies ist der ASP-Prozess (aspwp.exe), der weiterlebt un damit Applikationsdaten für den gesamten Webservice halten kann.
Wenns mehrere Server gibt, kann man einen zentralen Webservice zur Verfügung stellen, der nichts anderes als mein Beispiel von oben tut und dann "selector" per WebMethod zurückgibt. An den können sich dann die verteilten Server wenden
Wie meinst Du das mit der neuen Instanz?
Wenn es sich um einen ASP.NET Webservice handelt, laufen die alle unter dem aspnet-workerprozess, und der wird nicht beendet. Dann reicht dir ein statischer Member in deiner Webservice-Klasse oder ein Eintrag in der Application[]-Collection. Im Konstruktor kannst Du dann diesen dann durch lock() threadsafe für weitere Auswertungen puffern.