Ja, danke für die Antworten. Durch Experimentieren habe ich das auch gerade herausgefunden. Ich habe die Button-Erzeugung ins Page_Init verschoben - nun geht es...
Oh, hier gibt es ja schon einen Thread mit dem gleichen Thema - hab ich wohl nicht ausreichend gesucht - SORRY, dass ich schon einen neuen Thread ersteltl hab!!
Ich habe genau das gleiche Problem. Kennt denn jemand eine Lösung?
Ich erzeuge im Page_Load verschiedene LinkButtons und registriere die Methode lnkBtn_Click für jeden:
LinkButton lnkBtn = new LinkButton();
lnkBtn.Text = "Test";
lnkBtn.ID = "lnkBtnTest";
lnkBtn.Click += new EventHandler(lnkBtn_Click);
In der Methode lnkBtn_Click lass ich mir zum Test nur eine MessageBox anzeigen. Aber beim Klick auf einen LinkButton geht er nicht in die Methode. Ein Postback wird zwar ausgelöst, aber mehr auch nicht.
Original von Chris06
Laufen tut das sogar, nur geändert hat sich überhaupt nichts...
Was ich rausgefunden habe
(aus Artikel asp.net ajax (Atlas))
Das kann so wohl nicht funktionieren, da ich ja viele verschiedene aspx Sites habe.
Und jede dieser Sites läd die masterpage neu.
Ich meinte damit ja auch, dass Du nur eine aspx Seite haben solltest, in der dann nur der Inhalt (im UpdatePanel) geändert wird, wenn Du auf eine andere Seite springst, wird natürlich die Masterpage auch neu geladen...
Um einen Teil/nur den Inhalt der Seite neu zu laden, musst du AJAX/ATLAS verwenden. Das mache ich auch und es funktioniert super. Stichwort: UpdatePanel
Wie gesagt, weiß ich es nicht genau. Aber der oben genannte Link ist nicht die einzige Progressbar bei codeproject. Ich hab dort auch schon eine gesehen, die noch viel mehr konnte (auch style-mäßig), aber die finde ich leider momentan nicht. Such dort mal ein bisschen...
Also ich habe mir die Seite "Syntax" bei dir angesehen. Und einige Sachen wie z.B. "var x as string" oder "if (var = xyz)" oder "for (i = 0 to 10)" erinnern weniger an Java/PHP/C#
Aber ich finde das Projekt trotzdem interessant, werde mir das sicher noch genauer ansehen!
Ich habe gerade meine Sortiermethode geändert. Und zwar habe ich das ebene.Sort() an das Ende der Methode verschoben:
private void SortiereEbene(List<MyTreeNode> ebene)
{
for (int i = 0; i < ebene.Count; ++i)
{
if (ebene[i].Children.Count > 1)
SortiereEbene(ebene[i].Children);
}
ebene.Sort();
}
Damit wird nun jede Ebene falsch herum sortiert.
String.Compare für sich genommen funktioniert natürlich richtig und wenn ich zwei Objekte vom Typ MyTreeNode vergleiche, bekomme ich auch das richtige Ergebnis.
Deshalb wundert es mich wirklich, dass das über die rekursive Methode oben nicht funktioniert.
Vorübergehend habe ich es so gelöst, dass ich das Ergebnis von MyTreeNode.CompareTo() einfach umkehre (-1 -> 1, 0 -> 0, 1 -> -1). Damit wird der Baum erstmal richtig dargestellt. Natürlich klappt das Vergleichen von zwei einzelnen MyTreeNode-Objekten nun nicht mehr richtig (umgekehrtes Ergebnis). Daher ist es für mich keine endgültige Lösung.
Weiß vielleicht jemand, warum die rekursive Methode Probleme macht?
Hallo,
ich habe mir mit Hilfe von List<> und einem eigenen Typ einen Baum gebastelt.
Der eigene Typ MyTreeNode ist wie folgt implementiert:
public class MyTreeNode
{
private MyTreeNode _parent = null;
private List<MyTreeNode> _children = new List<MyTreeNode>();
private string _name;
public MyTreeNode Parent
{
get { return _parent; }
set
{
_parent = value;
if (value != null)
value.AppendChild(this);
}
}
public List<MyTreeNode> Children
{
get { return _children; }
set { _children = value; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
public void AppendChild(MyTreeNode newChild)
{
if (!_children.Contains(newChild))
_children.Add(newChild);
}
public int CompareTo(object treeNode)
{
if (treeNode == null)
return 1;
else
return String.Compare(((MyTreeNode)treeNode).Name, this.Name, StringComparison.CurrentCultureIgnoreCase);
}
}
So, nun fülle ich die Liste bzw. den Baum:
List<MyTreeNode> myTree = new List<MyTreeNode>();
MyTreeNode rootNode1 = new MyTreeNode();
rootNode1.Name = "2099";
myTree.Add(rootNode1);
MyTreeNode rootNode2 = new MyTreeNode();
rootNode1.Name = "2006";
myTree.Add(rootNode2);
Nach dieser Art und Weise baue ich mir folgenden Baum auf:
So weit, so gut.
Nun möchte ich jede Ebene sortieren. Dafür gehe ich den Baum Ebene für Ebene durch und wende List<>.Sort() an, welche meine CompareTo()-Methode verwendet, also nach dem Namen sortiert.
Hmm, auch wenn ich mir das schon fast gedacht habe, ist die Antwort nicht unbedingt die, die ich hören/lesen wollte X(
Gibt es vielleicht eine Möglichkeit, die DLL "anders" zu kompilieren bzw. zu konvertieren? Die DLL in C# neu zu erstellen wäre prinzipiell zwar möglich, aber ein riesiger (unerwünschter) Berg Arbeit
Hat denn wirklich niemand eine Idee, woran es liegen könnte? Ist die DLL fehlerhaft oder gar nicht zu gebrauchen oder kann der Fehler auch am Aufruf der Methode liegen?
Vielleicht noch ein paar Einzelheiten:
Die DLL, um die es geht, wurde mit Gupta/Centura frisch erstellt. Damit kenne ich mich zwar nicht aus, aber anscheinend werkelt beim Kompilieren auch irgendein C/C++ Compiler - zumindest stand da irgendetwas von "C++ Compiler".
Wenn ich die DLL im DependencyWalker öffne, wird mir die gewünschte Funktion auch in der "Export Function List" angezeigt. Weiterhin kenn ich die Parameter, die diese Funktion benötigt:
Hi,
ich habe die DLL nun mal mit DependencyWalker geöffnet und festgestellt, dass sie noch von zig anderen DLLs abhängig ist. Gut, also habe ich mir die anderen DLLs auch besorgt und in das bin-Verzeichnis kopiert.
Anscheinend wird nun alles gefunden. Allerdings bekomme ich nun einen anderen Fehler:
"Eine DLL-Initialisierungsroutine ist fehlgeschlagen"
Was bedeutet das jetzt? Ist mein Aufruf der Funktion falsch oder stimmt etwas anderes nicht?
Wenn ich die DLL nun mit DependencyWalker öffne, fehlt zumindest keine DLL mehr, aber er markiert die MPR.DLL rot und gibt mir folgende Meldung:
"Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module."
Die MPR.DLL ist doch eine Systemdatei, richtig? Die muss doch also in Ordnung sein
Hi,
ich versuche eine unmanaged DLL per DLLImport einzubinden. Beim Aufruf der eingebundenen Methode erhalte ich aber eine DllNotFoundException "Das angegebene Modul kann nicht gefunden werden".
Die DLL liegt aber im gleichen Verzeichnis wie die DLLs des Projekts (also im bin-Verzeichnis).
Kann er wirklich die DLL nicht finden oder liegt das an was anderem?
dadurch das du den webservice an 2 orten wieder eingebunden hast gibt es 2x den typ wieder, die funktionieren aber nicht miteinander
Ganz genau. Ich habe es jetzt so gemacht ,wie von Dir vorgeschlagen. Ich habe noch eine "Zwischenschicht" (also eine eigene Assembly) eingebaut, die den Webservice referenziert und in die Webseite und die Controls-DLL eingebunden wurde.
Damit funktioniert es, wie gewollt.
Ich dachte halt, dass es einen einfachen/schnellen Weg gibt, das ohne zusätzliche Schicht oder "komplizierte Erweiterungen" funktioniert.
Jedenfalls nochmal vielen Dank für Deine Unterstützung!
Original von sheitman
ja ich hab das ausprobiert, bei mir geht das auch... probier du es mal aus. du hast ja die probleme
Hab ich ja, aber - wie gesagt - funktioniert es bei mir nicht.
Also...
Ich habe meiner Webseite einen Webverweis auf den Webservice hinzugefügt. Dadurch wird eine WSDL-Datei erzeugt. Die drei angelegten Datei (*.wsdl, *.disco, *.discomap) liegen im Verzeichnis "App_WebReferences/MeinWebservice".
Im Webservice selbst habe ich eine Methode, die den Typ "ExterneLib.MeinTyp" zurückgibt. Wenn ich diese Methode aufrufe, bekomme ich natürlich nicht den Typ "ExterneLib.MeinTyp", sondern "MeinWebservice.MeinTyp", da dieser ja in der WSDL angelegt wurde.
So...
Nun habe ich ein weiteres Projekt, eine ClassLibrary (DLL) mit meinen Controls. Alle Klassen in dieser Lib sind im Namespace "MeineControls". Nun füge ich hier ebenfalls einen Webverweis auf den Webservice hinzu. Dann wird hier z.B. die schon erwähnt reference.cs und der ganze andere Kram angelegt. Dem Webverweis weise ich nun einen Namespace wie z.B. "Webservice" zu.
Nun habe ich aber nicht den Typ "ExterneLib.MeinTyp" oder - was auch noch passabel wäre - den Typ "MeinWebservice.MeinTyp", sondern ich habe hier nur den Typ "MeineControls.Webservice.MeinTyp".
Und ich kann halt nicht MeineControls.Webservice.MeinTyp in MeinWebservice.MeinTyp oder ExterneLib.MeinTyp konvertieren.
Also wie hast Du es denn gemacht, dass es bei Dir funktioniert 8o
Hmm, hast Du das mal ausprobiert? Ich glaube nicht, dass das funktioniert (oder ich bin wirklich zu blöd dazu).
In meinem Control (das ist also eine eigenständige DLL!) habe ich doch den Namespace "MeinWebservice" gar nicht zur Verfügung. Dort ist ja nur "MeineControls.Webservice" bekannt.
Und beim Hinzufügen eines Webverweises wird doch eine neue WSDL erzeugt. Oder meinst Du, ich sollte die WSDL aus der Webseite in mein Controls-Projekt kopieren? Geht das denn? Die würde doch jedesmal beim Kompilieren überschrieben werden
Ja, schon klar. Aber es sind ja trotzdem unterschiedliche Typen, wenn ich den Webservice einmal per Webreferenz in die Webseite einbinde und einmal in mein Control, oder nicht?
In meiner Webseite liegt die Webreferenz auf den Webservice im Verzeichnis "App_WebReferences/Webservice", damit hat mein Typ den vollen Namen "Webservice.MeinTyp".
In meinem Control füge ich den Webservice ebenfalls über eine Webreferenz hinzu und ich packe den - sagen wir einfach mal - auch in einen Ordner "Webservice". So, hier hat mein Typ aber den vollen Namen "MeinControlNameSpace.Webservice.MeinTyp".
Und damit sind die Typen (trotz gleichen Inhalts) doch unterschiedlich.
Danke für Deine Mühe!
Ja, das Auslagern der Webservice-Aufrufe in eine eigene DLL wäre auch noch möglich - stimmt! Daran habe ich noch gar nicht gedacht.
Zitat
problem ist halt das er nur aus daten besteht, und keine methoden mehr enthält...
Methoden brauche ich auch nicht, nur die Daten.
Mal sehen, vielleicht lagere ich die Webservice-Aufrufe wirklich in eine DLL aus... oder ich übertrage auch nur noch DataTables oder so was...
Diese SchemaImporterExtension habe ich mir auch schon angesehen und schon ausprobiert. Aber irgendwie will es nicht.
Evtl. hapert's auch nur daran, dass die ImpoerterExtesion in den GAC muss - das möchte ich nicht.
Aber mal von einer anderen Seite betrachtet: Ich muss ja nicht unbedingt den "richtigen" Typ haben, es würde mir genügen, wenn ich den serialisierten (und dann deserialisierten) Typ, der in der WSDL-Datei angelegt wird, auch in mein Control (DropDownList) bekomme. Kann ich vielleicht die WSDL-Datei der Webseite irgendwie in das Projekt mit den Controls "importieren"? Also so, dass Control und Webseite die gleiche Webservice-Referenz/WSDL-Datei nutzen?
Nee, ich benutze auch 2.0. Und wie ich schon schrieb funktioniert das ja auch, wie Du es gemacht hast. Aber eben nur bei Assemblies (also Konsolenanwendung, DLL etc.). Wenn Du jetzt aber in VS mal eine neue Webseite anlegst und dort einen Webverweis auf den Webservice hinzufügst, wird dort keine reference.cs angelegt, sondern nur 3 Dateien (wie ich oben schon geschrieben hab). Und daher kann ich das so leider nicht lösen.
Na ja, wenn man zu einer Webseite einen Webverweis hinzufügt, wird halt keine reference.cs erzeugt. Es werden dort nur 3 Dateien angelegt (*.disco, *.discomap, *.wsdl) - mehr nicht.
Anders bei richtigen Assemblies, dort wird unter anderem immer eine reference.cs angelegt, in der man schön herumpfuschen kann
Bin schon den ganzen Tag am Suchen und Probieren, aber bisher noch keine Lösung ;(
Leider bekomme ich es aber einfach nicht hin. Den Artikel bei codeproject habe ich auch vorher schon gelesen und das funktioniert auch. Aber leider nur bei "richtigen" Anwendungen. Bei Webreferenzen in Webseiten gibt es ja keine reference.cs, sondern nur eine WSDL-Datei, also hilft mir das dort nicht weiter.
Die anderen Links habe ich auch alle durchforstet, aber entweder bin ich zu blöd, das dort genannte umzusetzen oder.... ich weiß auch nicht. Ich krieg es einfach nicht hin X(
Ich habe auch schon versucht, den Typ in eine eigene Assembly auszulagern und habe diese in der webseite sowie im Control referenziert. Das Problem bleibt aber bestehen.
Denn der Typ wird ja in die wsdl-Datei eingetragen und die Methode vom Webservice liefert auf der Webseite den Typ MeinWebservice.Anrede, obwohl ich im Webservice die Methode so deklariert habe, dass der Typ ExtraAssemblyNameSpace.Anrede zurückgegeben wird. Der Typ wird einfach als complexType in die WSDL-Datei eingetragen und auf der Webseite wird nur der benutzt. Also habe ich wieder das Problem beim Befüllen der ComboBox:
MeinWebservice.Anrede kann nicht in ExtraAssemblyNameSpace.Anrede konvertiert werden