Laden...

Forenbeiträge von schuppsl Ingesamt 789 Beiträge

26.02.2010 - 11:09 Uhr

HallO Leute,
bin heute mal wieder komplett neben der Kapp und mache schon seit Stunden an einem Problem herum, welches warscheinlcih ganz einfach zu lösen ist.

Ich habe in meiner asp.net Anwendung eine Seitenklappe gebaut.

Der Hauptkontent der Seite hat einen linken Rand von 210px, damit links noch ein schwebendes fenster reinpasst.

Diesen Rand kann ich nun per Klick auf einen Button oben links verringern.
Das geht mit Javascript:



document.getElementById(""content"").style.marginLeft=""10px"";

Wenn der Rand dann klein ist und ich klicke wieder auf den Button wird er wieder auf 210px gebracht.
Das funzt einwandfrei. (ohne Postback)
Das Problem ist:Ist der Rand bei 10px und ich mache nen Postback, dann springt er wieder auf den Ausgangszustand von 210px zurück.
Ich hätte aber gerne, daß er bei 10px bleibt bei einem Postback und umgekehrt (daß er bei 210ox bleibt).

Also kurz: Der Zustand soll gespeichert werden.

Jetzt habe ich schon mit einem hidden feld herumgedockter, welches den aktuelle Zustand speichert:


document.getElementById(""hiddenKlappe"").Value = ""10px"";

Dieses Feld soll nun ausgelesen werden und in einer Session gespeicher werden.
Nur geht das nicht, da das ein-und ausklappen OHNE POSTBACK von statten geht.

Ich muss also irgendwie aus dem Javascript den Wert irgendwo speichern, damit ich mir den Wert merken und beim Postback wiederherstellen kann...

Ich hoffe Ihr konntet mir folgen...

Also die konkrete Frage lautet:

Wie kann ich einen Wert aus einem Clientseitigen Javascript auf dem Server speichern?

Danke und Grüße

23.02.2010 - 14:03 Uhr

Hat wer eine Idee hierzu?

05.02.2010 - 10:49 Uhr

Ok danke mal.
Mein Problem ist eben, daß ich die o.g. Probleme habe, wenn es auf integriert steht...

Liegt das dann an der Programmierung oder an der Einstellung IIS/web.config?

05.02.2010 - 08:53 Uhr

Weiß jemand wo der Unterschied ist?

05.02.2010 - 08:49 Uhr

Ah, das ist interessant, vielen Dank eichhörnchen.

04.02.2010 - 20:06 Uhr

Hallo Leute.
Also ich habe das nun inzwischen mit InnoSetup und Ultidev Cassini gemacht.
100% genau das, was ich wollte.
Den Cassini kann man ins Setup mit einbinden und wird automatisch mit Installiert.
Danke an alle schupsl

04.02.2010 - 20:06 Uhr

Sorry für Doppelpost.

Mit Inno Setup frage ich noch zusätzlich die Windowsversion ab, das Vorhanden sein desn Windows Installer und der erforderlichen .NET Framework Pakete.
Sollte eines nicht vorhanden sein, wird es direkt im Setup heruntergeladen.
Zudem kann man alles erdenkliche damit machen, wenn man sich in die Pascal Programmierung ein wenig einarbeitet.

Ist am Anfang schwer, aber es gibt genügend mitgelieferte Beispiele und im Internet noch mehr. Sogar exportierende Funktionen von DLLs kann man ansprechen.

27.01.2010 - 13:46 Uhr

Also ich habe jetzt mal den Pipelinemodus im DefaultApplication Pool auf "klassisch" gestellt, war bisher immer auf "integriert".
Jetzt scheint es zu gehen...
Habe zwar schon einige gelesen, aber nicht wirklich kapiert wo da der Unterschied sein soll...???
Was ist besser/schlechter?

27.01.2010 - 09:34 Uhr

Ja eine einfache Anwendung in der ich die XML Datei auslesen und ausgebe läuft.
Allerdings nicht mit einem statischen Konstruktor.
Ich werde es mal beim Rechner vom Chefe versuchen, der hat auch Windows 7.
Mit dem Testserver der VS2008 Umgebung läufts ja und mit dem Ultidev Cassini auch...aber die Kunden werden Hauptsächlich IIS 6 und IIS 7 einsetzen, deshalb wäre es prima wenn ich da Gewissheit hätte...

27.01.2010 - 08:39 Uhr

Nun wie beschrieben lautet die Meldung unter Windows 7: ASP.NET setup custom actions funktiniert nicht mehr.
Die Pfade stimmen, habe ich oben schon erwähnt.
Es muss an der Klasse mit dem statischen Konstruktor liegen...

26.01.2010 - 16:14 Uhr

Also ich weiß nicht mehr weiter-.
Seit heute morgen um halb elf mache ich an dem Problem herum, habe sogar die IIS neu installiert und inzwischen einen ganzen Tag verloren.

26.01.2010 - 14:22 Uhr

Hallo Peter.

Also ich bin jetzt etwas weiter:

Ich lese ja beim Start die config.xml aus und setze damit einmalig für diese Sitzung ein paar Variablen wie z.B. Verbindungsports usw.

Diese setze ich in einer statischen Klasse, so daß diese nicht instantiiert werden darf und soll.
Somit kann ich in der ganzen Anwendung auf diese zugreifen:


CGlob.Port
CGlob.Einstellungxy


usw.

Die XML Datei öffne ich ganz normal: var ports = XElement.Load( ConPath ); und durchlaufe diese nachhe rmit einer foreach Schleife.
Nun, die Pfade usw stimmen ja alle.

Das Problem ist.

Mache ich das Öffnen und Lesen der .xml Datei inerhalb der statischen KLasse, funktioniert es nicht!!!

Mache ich das in einer "normalen" KLasse, ist alles bestens!

Die Klasse sieht so aus:


namespace ext.Structs
{ 

    public class CGlob
    {                  
                
        /// <summary>
        /// Instantiieurng unterbinden (static)
        /// Hier einmalig aus config.xml initialisieren         
        /// </summary> 
       static CGlob()
        {

.....hier dann pfad ermitteln, Öffnen, auslesen und zuordnen

Es handelt sich also um einen statischen Konstruktor, damit scheint der IIS nicht klar zu kommen.

Dann außerhalb von CGLob:


 private static int _APP_PORT; 

             //Port
        internal static int APP_PORT
        {
            get { return _APP_PORT; }

Was ist hier falsch und warum geht das im VS2008 Testserver?
Wo ist der UNterschied?

Solche Geschichten wie

HttpContext.Current.Response.Write(ConPath); funktionieren auch nicht...

Bei aspnet_regiis -i stürzt irgendwas ab:
ASP:NET Setup customs...

26.01.2010 - 12:24 Uhr

Ja ich habe den IIS nach .NET installiert.
Beim registrieren kommt jedoch die Fehlermeldung, daß er den Befehl nicht findet..

Netzwerkdienst->Vollzugriff->Keine Änderung.
Die Logdateien kann er auch nicht schreiben, also muss es an irgendwelchen Berechtigungen liegen.
Nur weiß ich nicht mehr welche Berechtigungen ich noch zuweisen soll.

Habs inzwischen mal mit dem ULtidev Cassini versucht, damit gehts, mit dem IIS7 nicht.

@vbprogger danke für den Link.

26.01.2010 - 11:47 Uhr

Hallöle.

Ich möchte nun mal aus der Entwicklungsumgebung heraus und meine Anwendung veröffentlichen.
Habe also unter Windows7 Ultimate mit dem IIS7.5 eine neue Webseite eingerichtet und aus VS2008 die Seite veröffentlicht.

Geht soweit.
Im Projekt habe ich eine Config.xml Datei, welche wichtige Informationen beim Start der Anwendung ausliest.
Genau das funktioniert nicht, es kann auf die Datei offensichtlich nicht zugegriffen werden.

Ich habe schon mir, Jedem, Gast, IIS_IUSRS Vollzugriff auf das komplette veröffentlichungsverzeichnis gegeben, aber keine Chance.

Im Internet finde ich keine Anleitung wie man mit dem IIS7 eine ASP.NET Anwendung richtig einrichtet und die entsprechenden Berechtigungen setzt und was es halt noch so alles zu tun gibt.

Hat jemand Tips?
Warum kann die config.xml nicht geöffnet werden?
Welche Gründe könnte das haben?

Vielen Dank für jeden Hinweis.

25.01.2010 - 09:00 Uhr

Hallöle.

Ich hätte mal ein paar Fragen an die Experten hier, da die Suche nichts hergibt.

Ich möchte für mein asp.net Programm (3.5) eine Art Installationsroutine haben.
Wie könnte man das bewerkstelligen?
Einfach alle Dateien mit einem Zip Programm packen?
Mit z.B. Inno Setup eine Installationsroutine bauen, die die Dateien kopiert?

Dann soll ich eine Updatefunktion machen.
Das ist ja im Prinzip nichts anderes, als daß ich die neuen Dateien wieder ins entsprechende Verzeichnis kopiere, oder?

Gibts einen alternativen Webserver für Asp.net 3.5?
Da ich bisher ISAPI Programme entwickelt habe, konnten unsere Kunden mit einem alternativen Webserver diese ausführen, eben ohne IIS.

Gibts da für ASP.NET auch etwas?
Ultidev habe ich schon versucht, es stürzt dauernd ab und ist von daher unbrauchbar.

Gibts da noch mehr? Google gibts da auch nichts her...
Was mache ich mit Kunden die nur Windows 7 , Vista oder XP haben?

Vielen Dank schonmal, schuppsl

18.01.2010 - 08:24 Uhr

Danke für die Links, die kenne ich bereits.
Nur löst das mein Problem nicht, daß eben das Event TextChanged vor dem Button_Click Event ausgelöst wird.

Wie soll ich denn dann im Button_Click Event(Texte speichern) feststellen, welches Textfeld geändert wurde?
Mit Sessionvariablen geht das natürlich, aber ich möchte nicht unbedingt alles in eineer Session speichern..

15.01.2010 - 13:50 Uhr

Hi...hm....versteh nicht ganz, was soll das bringen?

15.01.2010 - 12:14 Uhr

Hallöle.

Also.
Ich habe 10 dynamisch erstellte Textboxen mit ID und dem zugewiesenen Event TextChanged.
Das Erstellen mache ich im Page_OnLoad Event.

Ändere ich die eine oder andere Textbox, wird beim nächsen Postback die Eventfunktion für TextChanged aufgerufen.
Somit kann ich alle Texte aus den Textboxen auslesen und in eine Textdatei speichern.

So weit so gut.

Jetzt möchte ich das Ganze aber per Button_Click event machen.
Also mit einem Button, namens "Speichern".

In diesem Speichern_Click Event möchte ich nun die geänderten Texte der Textboxen speichern.

Das geht aber von Haus aus nicht, da das TextChanged Event VOR dem ButtonClick event gefeuert wird.

Also weiß ich im Speichern_click Event schon nicht mehr welche Texte denn nun geändert wurden.

Ein Lösungsansatz wäre, daß ich im TextChanged Event die geänderten Texte in eine Session speichere und dann im ButtonClick event auswerten und speichere.

Geht das auch anders?

Danke für jeden Tip.

13.01.2010 - 14:44 Uhr

Hi erstmal erstell bitte deine Controls in der

     
protected override void CreateChildControls()  
{  
this.Controls.Clear();  
add myControl  
}  
  

Warum?

13.01.2010 - 09:57 Uhr

Also Aufgrund meine Problems mit DDL (DropDownList) im anderen Thread, habe ich nun ein paar Experimente gemacht.
Entweder ich bin nun völlig Gaga oder ich habe was grundsätzliches nicht verstanden.
Es geht darum, wie in einer dynamisch erstellten DDL ein Wert selsktiert werden kann.

Dazu folgender Quelltext, de ich so in einer neuen ASP.NET Seite habe:



 protected void Page_PreRender(object sender, EventArgs e)
        {                       
                
                for (int i = 0, o = Int32.Parse(Session["page"].ToString()); i < 10); i++)
                {

                    ListItem item1 = new ListItem("1", "1");
                    ListItem item2 = new ListItem("2", "2");
                    ListItem item3 = new ListItem("3", "3");

                    DropDownList drop = new DropDownList();
                    drop.ID = "drop"+i;

                    drop.Items.Add(item1);
                    drop.Items.Add(item2);
                    drop.Items.Add(item3);
                   
                  
                

                    panErg.Controls.Add(drop);

                    o++;
                    if (o >= 3) o = 0;                  
                           
            }
        }


..........

 protected void Page_Load(object sender, EventArgs e)
        {


            Session["page"] = 0;
}

Zur hervorhebung, das hier ist der wichtige Teil:


  drop.Items[o].Selected = true;

Ich erstelle also in einer Schleife 10 DDL Boxen mit unterschiedlichen IDs.
Jeder DDL weise ich 3 Werte mit jeweils 1,2 und 3 zu.
Nacheinander werden dann alle DDL vorselektiert und zwar nacheinander mit 1,2,3,12,3,1,2,3 usw.

Das funktioniert und der Quellcode sieht nachher so aus:


 
<select name="drop0" id="drop0">
		<option selected="selected" value="1">1</option>
		<option value="2">2</option>
		<option value="3">3</option>
 
	</select><select name="drop1" id="drop1">
		<option value="1">1</option>
		<option selected="selected" value="2">2</option>
		<option value="3">3</option>
 
	</select><select name="drop2" id="drop2">
		<option value="1">1</option>
		<option value="2">2</option>
		<option selected="selected" value="3">3</option>
 
	</select><select name="drop3" id="drop3">
		<option selected="selected" value="1">1</option>
		<option value="2">2</option>
		<option value="3">3</option>
 
	</select><select name="drop4" id="drop4">
		<option value="1">1</option>
		<option selected="selected" value="2">2</option>
		<option value="3">3</option>
 
	</select><select name="drop5" id="drop5">
		<option value="1">1</option>
		<option value="2">2</option>
		<option selected="selected" value="3">3</option>
 
	</select><select name="drop6" id="drop6">
		<option selected="selected" value="1">1</option>
		<option value="2">2</option>
		<option value="3">3</option>
 
	</select><select name="drop7" id="drop7">
		<option value="1">1</option>
		<option selected="selected" value="2">2</option>
		<option value="3">3</option>
 
	</select><select name="drop8" id="drop8">
		<option value="1">1</option>
		<option value="2">2</option>
		<option selected="selected" value="3">3</option>
 
	</select><select name="drop9" id="drop9">
		<option selected="selected" value="1">1</option>
		<option value="2">2</option>
		<option value="3">3</option>
 
	</select>


Es werden also alle 10 DDL erstellt und korrekt vorselektiert. (selected=selected)

So, bis hierhin alles gut.

Jetzt ändere ich die Art der Vorselektierung und tausche :


drop.Items[o].Selected = true;

gegen:



 string ee = o.ToString();
 drop.SelectedValue = ee;

Ich wandle also "o" in einen String und mache so die Vorselektion.
Ergebnis ist eine falsche vorselektion der DDLs:



<select name="drop0" id="drop0">
		<option value="1">1</option>
		<option value="2">2</option>
		<option value="3">3</option>
 
	</select><select name="drop1" id="drop1">
		<option selected="selected" value="1">1</option>
		<option value="2">2</option>
		<option value="3">3</option>
 
	</select><select name="drop2" id="drop2">
		<option value="1">1</option>
		<option selected="selected" value="2">2</option>
		<option value="3">3</option>
 
	</select><select name="drop3" id="drop3">
		<option value="1">1</option>
		<option value="2">2</option>
		<option value="3">3</option>
 
	</select><select name="drop4" id="drop4">
		<option selected="selected" value="1">1</option>
		<option value="2">2</option>
		<option value="3">3</option>
 
	</select><select name="drop5" id="drop5">
		<option value="1">1</option>
		<option selected="selected" value="2">2</option>
		<option value="3">3</option>
 
	</select><select name="drop6" id="drop6">
		<option value="1">1</option>
		<option value="2">2</option>
		<option value="3">3</option>
 
	</select><select name="drop7" id="drop7">
		<option selected="selected" value="1">1</option>
		<option value="2">2</option>
		<option value="3">3</option>
 
	</select><select name="drop8" id="drop8">
		<option value="1">1</option>
		<option selected="selected" value="2">2</option>
		<option value="3">3</option>
 
	</select><select name="drop9" id="drop9">
		<option value="1">1</option>
		<option value="2">2</option>
		<option value="3">3</option>
 
	</select>



Es wird nicht nach Schema 1,2,3 vorselektiert.
Was ist hier falsch?

Warum funktioniert SelectedValue nicht korrekt?
Das habe ich natürlich auch angepasst:

Session["page"] = 0;
und
if (o > 3) o =1;

13.01.2010 - 08:31 Uhr

Hallöle.

In meinem C#/ASP:NET Projekt werden in der Entwicklungsumgebung ja alle Funktionen aufgelistet.

Und zwar im Texteditor sind unterhalb von jedem Tab ja 2 Dropdownlisten:
Die linke für Namespaces und die rechte für die Funktionen und Felddeklarationen.

Ich hätte gerne, daß da nur die Funktionen aufgelistet werden, nicht aber die Felddeklarationen ( programm.aspx.designer), da es sonst sehr übersichtlich wird.

Versteht Ihr was ich meine?
Wo kann man das einstellen?

12.01.2010 - 14:26 Uhr

Hi. Siehe oben.

Diese Funktioni rufe ich im Button_Click Event auf.
Davor wird das Array etc. befüllt.

12.01.2010 - 14:14 Uhr

Das Array erstelle und fülle ich so:



string[] readArr = null;
.......

string[] par = { ";", Environment.NewLine };
arr = read.Split(par, StringSplitOptions.RemoveEmptyEntries);


Es ist also ein String Array, welches auch komplett mit Strings gefüllt ist.
In "read" steht eine Semikolon separierten Zeichenfolge.

Das Array ist gefüllt, das habe ich schon quasi tausendfach mit dem Debugger geprüft:-)

Habs auch schon so versucht, hat aber auch nichts gebracht:


((DropDownList)_ctrl).SelectedIndex = Int32.Parse( arr[zaehl]); 

Also ich pflanze hier nun den kompletten Quellcode rein, damits deutlicher wird.
Es ist eine Funktion, welche rekursiv die Seite durchsucht und dann mit Daten füllt.
Die Textfelder und Checkboxen werden absolut korrekt befüllt, nur die DDL nicht:



   public void ReversQuery()
    {
         
        foreach (Control _ctrl in con.Controls)
        {
            if (_ctrl is TextBox)
            {
                zaehl++;
                ((TextBox)_ctrl).Text = arr[zaehl - 2]; //Texte in die Textboxen
            }
            else if (_ctrl is CheckBox)
            {
                zaehl++;
                ((CheckBox)_ctrl).Checked = (arr[zaehl] == "1" ? true : false); //Tab aktiv oder nicht?

            }
            else if (_ctrl is DropDownList)
            {
                
            ((DropDownList)_ctrl).SelectedValue = arr[zaehl ];

            zaehl++;
            }
            else
            {
                _con = _ctrl;
                ReversQuery(); // Unterelemente durchsuchen
            }
        }

    }

12.01.2010 - 11:25 Uhr

Hallöle.

Ich habe ein komisches Problem mit einer Dropdownlist auf meiner ASP.Net Seite.

Da sind also insgesamt 10 dropdownlists, welche Dynamisch erstellt werden bei jedem Seitenaufruf.
Im Quelltest sieht das nachher so aus:

<select name="ctl00$Content$drop0" id="ctl00_Content_drop0">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>

  	&lt;/select&gt;

Die ID= ctl00_Content_drop0 wird hochgezählt, also jede von den 10 Dropdowns hat eine eindeutige ID (_drop1, _drop2 usw).
Die Values sind bei jeder Dropdownbox gleich. (1,2,3)

Welcher Wert ausgewählt werden soll, lege ich in einem Button_click Event fest, welcher diese Seite aufruft.
Die Inhalte bestehen dann (sicher!) schon, ich lege nur das SelectedValue Attribut für jede einzelne DropDownList fest:

string insert = arr[zaehl].Trim();
((DropDownList)_ctrl).SelectedValue = insert;

In "insert" steht also 1,2 oder 3.
Die Controls werden nacheinander gesucht und aufgelistet, das habe ich kontrolliert, die ID wird eindeutig gefunden (_ctrl).

Mein Problem ist nun, daß die Selektion nicht stimmt.
D.h. teilweise.

Lege ich das SelectedValue Attribut so wie oben, wird bei jeder Box der Wert "2" als ausgewählt dargestellt, obwohl es sich um verschiedene Zuweisungen handelt.

Lege ich die Werte so fest, dann stimmts:

string insert = "1";
((DropDownList)_ctrl).SelectedValue = insert;

In diesem Falle ist also jedes Dropdown mit "1" ausgewählt.
Dasselbe funktioniert mit 2 oder 3.
Dann ist eben jede Liste mit 2 oder 3 ausgewählt.

Also Grundsätzlich funktioniert es, nur wenn ich die Werte wie im ersten Beispiel zuweise nicht!
Derweil stimmen die Werte!
Es sind keine Sonderzeichen drin, sondern nur die strings 1,2 oder 3.
in arr[zaehl] steht immer der korrekte Wert drin und dieser wird auch zugewiesen!
Trotzdem funktioniert es so nicht.

string insert = arr[zaehl].Trim();
((DropDownList)_ctrl).SelectedValue = insert;

Die Frage ist also nun: Warum funktioniert es mit der direkt Zuweisung und nicht mit dem Auslesen aus dem Array?

Ich hoffe Ihr versteht das Problem an dem ich schon sehr lange rummache und langsam verzweifelt bin.

Danke für jeden Hinweis!

18.12.2009 - 09:19 Uhr

Ja ok das kann ich natürlich machen.
Aber dann kann ich sie clientseitig nachher nicht ansprechen, da sie ja keine IDs haben...

18.12.2009 - 08:35 Uhr

Hallo.
Angelehnt an diesen Thread möchte ich die Diskussion hier fortführen.

Erst mal ein Zitat:

grundsätzlich solltest du vermeiden, mit Strings für Controls zu arbeiten. Das ist normalerweise nicht nötig, unter Windows-Forms auf keinen Fall und vermutlich auch bei ASP.NET nicht.

Ich weiß jetzt nicht genau wie das gemeint ist.
Es geht aber auch darum, daß man keine IDs zusammenbaut aus Strings und integern, wie z.B. so:

for( int =0; i<10;i++)
{
Textbox txt = new textbox;
txt.ID = "text"+i;
}

Nur frage ich mich, um die Diskussion mal zu eröffnen, wie ich es sonst machen kann.
Ich möchte 10 dynamische Controls erstellen, die ja alle eine andere ID haben müssen.
Oder war das mit den Strings anders gemeint?

Oder andersherum:

Ich habe in der aspx Seite 10 Textboxen fest definiert und mit text1 bis text 10 benannt (ID)

Diesen möchte ich nun dynamisch Texte zuweisen.
Eine Möglichkeit wäre folgende:


text1.text = " Text für Text1";
text2.Text= "text für Text2";
....
text10.Text = "Text für Text10";

Die dynamischen Texte kann ich ja dann z.B. aus einem Array holen.
angenommen ich habe 100 Textboxen, wird das etwas unübersichtlich.
Gäbe es an eine andere Vorgehensweise?

17.12.2009 - 18:08 Uhr

hmm...
ich weiß jetzt nicht genau ob ich verstanden habe wie du das meinst mit den Strings...werde morgen mal ein paar Sachen ausprobieren...

Wenn ich ein hiddenServerEvent habe, dessen Value Clientseitig beim Mausklick da reingeschrieben wird, dann ist das nunmal ein String...

17.12.2009 - 17:53 Uhr

Nun, es geht hier schon um eine ASP Anwendung und da sollte ich ja IDs verteilen, damit die Controls nachher Clientseitig ansprechbar sind und das geht halt nur mit Strings, oder wie hast du das gemeint?
Schätze bei Forms ist was etwas anders...

17.12.2009 - 15:50 Uhr

tab1 wird nicht geparst, da dieser ein spezieller tab darstellt:-)

Es ist die Beziehung von tabx zum Index von readArr wie juetho korrekt erkannt hat.

nein. es wurde schon mehrfach genannt, was am schnellsten und einfachsten ist

Du meinst das Dictionary.
Das muss ich aber auch erst ein mal füllen mit Werten tab2-tab10 und dann wieder auslesen (zwar über den Index aber trotzdem) , das kostet auch Zeit, nicht?

17.12.2009 - 15:02 Uhr

Wow, so viele Antworten.
Nun, es ist eine ASP.NET Anwendung.

An dem Quellcode komme ich bei fast jedem Mausklick vorbei bei bestimmten Seiten.

In hiddenserverelement.value steht die id des angeklickten Tabs, in diesem Falle "tabx".

Wurde z.B. "tab3" angeklickt, benötige ich den Namen dieses Tabs.

Dieser steht dann in einem Array, "readArr" welches zuvor aus einer Datei ausgelesen wurde.

Also der Name für tab6 steht dann in readArr[12].
Mit diesem Namen arbeite ich dann weiter.
Es wird eine Datei ausgelesen mit diesem Namen, und mit dessen Inhalt dynamische Controls für diesen Tab erstellt und mit Inhalt gefüllt.
Es ist alles dynamisch und kann sich bei jedem Mausklick ändern...deshalb.

Nun, um mal auf da Beispiel von juetho zurück zu kommen, dann könnte es so aussehen:


                string tab = hiddenServerEvent.Value;
                int index = int.Parse(tab[3].ToString());
                tabName = readArr[(index-2) * 3];


Das funktioniert natürlich, aber die zweite Zeile ist noch zu umständlich.
Aber grundsätzlich ist es so am schnellsten/einfachsten?

17.12.2009 - 13:54 Uhr

Hallo.

ich mache mir grade Gedanken darüber wo ich noch meinen Code so optimieren kann, daß Rechenzeit gespart wird.
Aktuell bin ich grade an einer Abfrageschleife, welche einen Wert vergleicht und danach einem anderen den entsprechenden Wert zuweist.
Doch Quellcode sagt mehr als tausend Worte:

Variante1:



                if (hiddenServerEvent.Value == "tab2")
                    tabName = readArr[0];

                else if (hiddenServerEvent.Value == "tab3")
                    tabName = readArr[3];

                else if (hiddenServerEvent.Value == "tab4")
                    tabName = readArr[6];

                else if (hiddenServerEvent.Value == "tab5")
                    tabName = readArr[9];

                else if (hiddenServerEvent.Value == "tab6")
                    tabName = readArr[12];

                else if (hiddenServerEvent.Value == "tab7")
                    tabName = readArr[15];

                else if (hiddenServerEvent.Value == "tab8")
                    tabName = readArr[18];

                else if (hiddenServerEvent.Value == "tab9")
                    tabName = readArr[21];

                else if (hiddenServerEvent.Value == "tab10")
                    tabName = readArr[24];

Variante 2:


int maxReg = Int32.Parse(Resources.intern.INT_MAXANZREG);
                for (int z = 2,t=0; z <= maxReg ; z++,t+=3)
                {
                    if (hiddenServerEvent.Value == "tab" + z)
                    {
                        tabName = readArr[t];
                        break;
                    }
                    
                }

Ich denke Variante 1 ist schneller, da keine Laufzeitvariablen definiert und hochgezählt werden müssen.
Variante 2 ist deshalb langsamer, benötigt aber weniger Code.

Was meint Ihr?
Welcher Code ist zur Laufzeit schneller?

15.12.2009 - 10:50 Uhr

Hallöle.

Mal wieder habe ich ein spezielles Problem.

Und zwar nutze ich ja die Obout.Inc Controls welche sehr gut sind.
Unter anderem gibts da ein AjaxPage Control, welches Updatepanels etc bereit stellt.
Bitte jetzt nicht über Sinn und Unsinn darüber diskutieren.

Es ist nun so, daß man die AjaxPage Controls nur nutzen kann, wenn die Seiten von OboutInc.AjaxPaeg erben:



  public class PageName : OboutInc.oboutAJAXPage


Ist im Prinzip kein Problem, so lange man eine "normale" Seite hat.
Ich möchte diese Funktionalität aber gerne in einer Masterpage haben.

Da die Masterpage ja von Masterpage ableitet, geht das nun hier nicht mehr.
Auf der Supportseite beschreiben die es so:

Q:

I want to use AJAXPage but my page already inherits from another class.What can I do?

A:

AJAXPage works only when your page inherits from OboutInc.oboutAJAXPage instead of System.Web.UI.Page.
If you page already inherits from another class, you can inherit that class from OboutInc.oboutAJAXPage.

For example:
public class MyWebPage : AnotherBasePage
{
...

just inherit AnotherBasePage class from OboutInc.oboutAJAXPage

public class AnotherBasePage : OboutInc.oboutAJAXPage
{
...

Das ist mir auch klar wie das gehen soll, hilft mir nur nicht weiter, da es sich bei mir um eine MasterPage dreht.

Jetzt habe ich schon alles möglich versucht, aber ohne Ergebnis.
Page ist Page und Masterpage ist Masterpage.

Also geht das in der Masterpage nicht?

17.11.2009 - 11:02 Uhr

Hi Phillip, ich meinte natürlich Dich:-)

Ich habe gelesen, daß OnLoad einen minimalen Performancegewinn bringen soll...

Grüße schuppsl

17.11.2009 - 07:33 Uhr

Hallo Scott.

Vielen Dank für Deine Hilfe.
So ähnlich mache ich das auch, nur funktioniert es nicht so wie ich es haben will, da bei jedem Aufruf der Seite das Event TextChanged aufgerufen wird.
Ist ja auch logisch, denn ich ändere ja jedes Mal den Text in der Textbox.

Also ist das so nicht möglich was ich vorhabe.
Ich möchte eigentlich nur wissen, welche Textbox von Hand geändert wurde, also bei welcher der Benutzer einen Text eingegeben hat.

Das ist so nicht möglich.
Ich muss mir also was anderes einfallen lassen, z.B. die Werte in einer Session speichern und dann vergleichen.
Ist was umständlich aber anders ist es in diesem Falle mit asp.net nicht möglich, das habe ich jetzt nach einer Woche testen herausgefunden.

Warum nutzt du Onload, statt Page_Load?

16.11.2009 - 11:10 Uhr

Nun, das was ich hier im Kleinen habe, mache ich dann später im Großen:

Ich habe eine Textbox, die bei jedem Seitenaufruf dynamisch erstellt wird.(immer gleiche ID)
Der Text darin wird ebenfalls jedes Mal dynamisch zugewiesen und ist jedes Mal ein aderer.
Dies wird hier durch die Zählvariable simuliert.

Gleichzeitig möchte ich, daß die Textbox auf das Ereignis "TextChanged" reagiert.
D.h. wird der Text geändert, soll die Entsprechende Event-Funktion aufgerufen werden
(TextBox_TextChanged()) und darin ermittle ich den geänderten Text und speichere ihn irgendwo.

Das ist eigentlich schon alles.

13.11.2009 - 11:23 Uhr

Diesen Satz habe ich mir auch angeleuchtet🙂

Ob ich das wohl noch in diesem Jahrhundert kapiere... X(

Also alle Elemente innerhalb des <Form> Tags werden generell zum Server gesendet, richtig?
Also unabhängig von Viewstate, richtig?

D.h. also alle Controls außerhalb des Form Elements werden in Viewstate gespeichert?

Nee, das kann auch nicht sein, da der Viewstate enorm anwächst je mehr controls ich definiere.

Also was nun ?

Daß EnableViewstate keinerlei Wirkung auf mein Steuerlement ausübt weiß ich jetzt.
Ich weiß auch (nach MSDN Lektüre ) ,daß wenn ich den Text des Steuerelements vor Init oder Load programmatisch verändere, wird es wieder überschrieben.
Also muss ich das später machen, z.B. PreRender (Wie du schon beschrieben hast).

Also muss ich ich meine Textbox in Page_Load erstellen, das Textchanged Ereignis delegieren und mir eine Referenz auf diese Textbox speichern.

Diese nehme ich dann im PreRender Ereignis zur Hand und verändere den Text,. der dann nicht mehr überschrieben wird.

13.11.2009 - 10:26 Uhr

Nun die Seite kenne ich.

Da steh u.A.:

Sie können ViewState für einzelne Steuerelemente, Seiten oder sogar Anwendungen deaktivieren. Sie benötigen ViewState nicht, wenn die folgenden Voraussetzungen erfüllt sind:

Das Steuerelement verfügt über keine dynamischen oder datengebundenen Eigenschaftswerte (bzw.** sie werden im Code bei jeder Anfrage festgelegt)**.

Genau das ist bei mir der Fall.
Trotzdem wird der Zustand wieder hergestellt, trotz dem emppfohlenen EnableViewstate = false;

13.11.2009 - 08:22 Uhr

Phil_B: das hatte ich schon versucht, bringt leider auch nichts.

Mars:

Ich kämpfe mich grade durch die MSDN, habe aber noch keine Lösung gefunden,
muss noch mehr über den Ansichtszustand lesen.

Wenn ich EnableViwestate auf false setze sollte da Problem doch eigentlich gelöst sein.
Dem ist aber leider nicht so...

12.11.2009 - 14:33 Uhr

das dürfte daran liegen, daß du die Textbox bereits im Page_Load erstellst, und ihr immer die selbe ID verpasst.

Na und? Die Textbox wird doch bei jedem Aufruf NEU erstellt...?

Da der Wert der Textbox mit dem Postback wieder an den Server geschickt wird, trägt ASP.net diesen Wert wieder ein, und zwar nach dem Page_Load.

Hm...nach dem Page_Load...ok.
Und wann genau?
Und vor allem: Warum?
Habe doch Viewstate = false angegeben? Also sollte er genau das nicht machen...?

Danach erst kommen die Postback-Eventhandler dran: Wenn Du ein Onclick-Event für deinen Button definierst und den Text erst dort setzt, funktioniert der Code (ebenso im Page_PreRender).

Gruß, MarsStein

Das Problem hierbei ist dann wieder, daß ich das Event "TextChanged" für die Textbox nicht implementieren kann, da es im Onclick-Ereignis zu spät dafür ist, deshalb habe ich das Ganze in Pag_Load...

Schon wieder diese Zwickmühle und ich peils einfach nicht...

12.11.2009 - 10:30 Uhr

Hallöle.
Ich habe mal wieder ein Anfängerproblem.
Folgender einfacher Code:



public partial class test : Page
    {


        protected void Page_Load(object sender, EventArgs e)
        {

            if ( !Page.IsPostBack )
            {
                Session.Add( "texttest", 1 );                
            }
            
            if ( Page.IsPostBack )
            {

                TextBox t = new TextBox();
                t.ID = "ttt";
                t.AutoPostBack = false;
                t.EnableViewState = true;
                t.Text = Session["texttest"].ToString();
               
                int zaehl = Int32.Parse(Session["texttest"].ToString());
                zaehl++;
                Session["texttest"] = zaehl;
                pantest.Controls.Add( t );

            }
            



        }
}

Ich erstelle also bei jedem Postback der Seite eine neue Textbox und schreibe einen Text rein.
In diesem Falle ist es einfach eine Zahl die jedes Mal inkrementiert wird.
Das Ein- und Aulsesen aus der Session funktioniert und die Zahl ist bei jedem Klick auf einen Button um eins erhöht und wird in die Textbox geschrieben.

(t.text = Session...)

Doch der Text in der Textbox ändert sich nicht.
Es bleibt immer bei "1" stehen.

Daß die Textbox erst beim ersten Postback erstellt wird ist mir klar und das ist auch egal.
Fakt ist, daß ich einen statisch deklarierten Button habe, der einen Postback auslöst und dadurch die Textbox bei jedem erneuten Aufruf der Seite neu erstellt wird und mit der um eins erhöhte Zahl beschrieben wird.

Ich habs schon mit EnableViewState= false im Panel, Textbox und in der Page-direktive versucht: Keine Änderung.

Der Inhalt in der Textbox bleibt immer bei dem Text der als Erstes reingeschrieben wurde, in diesem Falle "1" .

Woran liegt das denn?

11.11.2009 - 11:51 Uhr

Hallo MarsStein, Du warst schneller als ich.
Habe meinen Post oben geändert, schreibe meine Frage aber wieder rein, damit Deiner nen Sinn ergibt:-)

11.11.2009 - 11:22 Uhr

Hallo MarsStein.

Also die Vorgehensweise ist grundsätzlich gut, für mich aber unbrauchbar,
da ich das Clientseitige Event "onchange" setze und dadurch ein Postback ausgelöst wird.
Deshalb bringt ja auch "AutoPostBack = false" nichts... ist ja Clientseititg. =)

D.h. also wenn ich jetzt 5 Felder auf einmal andern möchte, wie .z.B. Adressdaten, geht das nicht da eben bei jeder einzelnen Änderung im Textfeld ien Postback ausgelöst wird.
Ich sollte dann erst beim Button "speichern" die Änderungen feststellen und dann alle geänderten Felder speichern...

Also muss ich meine vorgehensweise doch ändern.

EDIT:

string par = Request.Params["nameDerTextbox"]  

geht nicht, da par immer =null ist.

11.11.2009 - 10:32 Uhr

Hallo MarsStein.

Du hast natürlich recht, ich verwechsle immer noch Server und Client-Seitig.

Also mit "onchange" geht es nun.

Was habe ich gemacht?

Ich habe im Codebehind das Interface IPostBackeventHandler implementiert:



 public partial class personenstamm : AC.Basis.BasePage, IPostBackEventHandler

Dann muss ich natürlich RaisePostbackEvent implementieren:



 public void RaisePostBackEvent( string eventArgument )
        {
            Label1.Text = "Postback handled by " + this.ID.ToString() + ". <br/>" +
                          "Postback caused by " + eventArgument + "." +
                          "Inhalt: ";

            System.Web.UI.Control ct = panel_tab2.FindControl( eventArgument );


           
        }

Das Event füge ich per Attribute.Add in der Funktion Button_Click zu:



cs.txtbox.Attributes.Add( "onchange", cm.GetPostBackEventReference( this, cs.txtbox.ID.ToString() ) );

Soderle.
In RaisePostBackEvent bekomme ich nun als String die ID der veränderten Textbox übermittelt.
Darum versuche ich nun per FindControl die Textbox zu finden und diese auszulesen, da ich die Änderung später dann speichern muss.

Nur wird das Control leider nicht gefunden:


   System.Web.UI.Control ct = panel_tab2.FindControl( eventArgument );

"ct" ist hier immer null.
Das Control sollte doch aber existieren...?

Ein weiteres Problem ist auch, daß er immer ein Autopostback macht, obwohl ich das ausgeschaltet habe.
Es soll irgendwann mal so sein, daß ich alle geänderten Textboxen erkenne und dessen Text auslese...

Vielen Dank mal, hat mich schon wieder weitergebracht und nebenher habe ich wieder was gelernt... 👍

11.11.2009 - 08:29 Uhr

Also wenn ich das Beispiel ummünze auf ontextchanged, gehts nicht.
Ich habs getestet wie im Beispiel mit onlick, da hats funktioniert, dann habe ich es mit einer Textbox und ontextchanged versucht, da gehts nicht...

10.11.2009 - 15:47 Uhr

Hmm...ich muss halt wissen, welche Textfelder geändert wurden.

Ich dachte erst, ich mache das per Javascript und schreibe die Änderungen in ein Hiddenfield, welches ich beim nächsten Postback auslese.
Um mir das zu ersparen dachte ich über das textchanged Event nach.
Mittlerweile mache ich da schon nen ganzen Tag ohne Ergebnis herum.
Also, jetzt weiß ich immerhin, daß es so nicht geht.
Ich frage mich wie das andere so machen, da ich ja nicht der einzig bin, der dynamische Controls erstellt.

Gut, dann muss es halt anders gehen!

Muss ich halt im Button_Click Event feststellen, welche Textboxen erstellt werden müssen, diese Infos (ID)in eine Session schreiben und diese dann im Page_load oder Init aus der Session auslesen und da die Textboxen erstellen.
So müsste es dann gehen, da ich dann die Events gleich abonnieren kann.
Warum einfach wenns auch umständlich geht.

10.11.2009 - 14:47 Uhr

Hallo,

schau Dir dazu auch mal die "ClientScriptManager.GetPostBackEventReference"-Methode und das "IPostBackEventHandler"-Interface an, damit sollte das funzen.

Gruß, MarsStein

Ja, das ist das hier.
Habe ich schonmal gelesen, aber nicht kapiert.
Muss wohl nochmal da durchbeissen.
Danke.

10.11.2009 - 14:32 Uhr

Du solltest Events so früh wie möglicht (OnInit) und spätestens in OnLoad registrieren. Das Control braucht auch zwingend eine ID und muss zum gleichen Zeitpunkt zur Control-Hierarchie hinzugefügt werden, sonst funktionierts nicht.

Zum Thema dynamische Controls, kannst du dich hier mal einlesen:

Das ist echt verzwickt.
Die Controls kann ich erst in der button_Click Funktion erstellen, welche aber ja wie erwähnt nach Load aufgerufen wird.
Die ID gebe ich mit.

Die Controls statisch erstellen geht nicht, da sie jedes Mal neu erstellt werden.

Ich habe nun im Button_Click Event in der ich die Textboxes erstelle eine Arraylist in die ich die neu erstellten Textboxen speichere.
Diese Arraylist speichere ich wiederum in einer Session.
Aus dieser Session lesen ich die Referenzen der einzelnen Textboxen aus und deklariere dann das Event:
Leider geht das nicht.


if ( Page.IsPostBack )
            {
                if ( Session["textBoxList"] != null)
                {
                    ArrayList list = (ArrayList)Session["textBoxList"];

                    foreach ( TextBox item in list )
                    {
                        item.TextChanged += new EventHandler( textb_TextChanged );

                    }
                }
             }


Also keine Chance?

09.11.2009 - 15:07 Uhr

Hello.

Ich stehe mal wieder auf dem Schlauch.

Also folgendes:

In meiner Anwendung habe ich z.B. einen "Speichern" Button, der beim Klick in die definierte button-Click Funktion springt.

In dieser Funktion erstelle ich einige dynamische Steuerelemente und weise diese einem asp.panel zu.
Nach dem Postback erscheinen diese Controls, nehmen wir mal an Textboxen auf der Seite.
So weit so gut.

Die Textboxen erstellen ich so:


Textbox txt = new Textbox();
txt.id="test";
txt.TextChanged+= new EventHandler( txt_TextChanged );

Die Funktion txt_TextChanged existiert.
Nur leider wird diese Funktion nicht aufgerufen, wenn ich in einer Textbox einen text ändere und den Fokus dann verlasse.
Durch AutoPostback?true wird zwar ein Postback ausgelöst, aber nicht das Event.

Ich nehme an, das liegt daran, daß Events frühestens im Page_Load definiert werden müssen?

Das ist aber ein Problem, da ich hier die Referenzen auf die dynamisch erstellten Textboxen nicht mehr habe, die in Button_click() erstellt wurden.

Wie kann ich nun den Textboxen die Eventhandler zuweisen, damit diese ausgelöst werden.
In der Funktion Button_click werden verschiedene Textboxen, Checkboxen und dropdoenlisten erstellt.
Mal mehr mal weniger, es kann nur eine sein, oder auch 100.

Ich müsste mir entweder die Referenzen irgendwo speichern, oder beim Page_Load alle Controls dieses Panels durchlaufen, aber das geht auch irgendwie nicht, da die COntrolcollection immer null ist...

Stehe also doppelt auf dem Schlauch...

Wie könnte ich das machen?

04.11.2009 - 10:31 Uhr

Hallo schuppsl

Abgesehen davon, würde ich dir sowieso raten, das Web Application Project (WAP) zu benutzen, und nicht wie bisher das Website-Project.
Dort hättest du diese Probleme nicht mehr und viele Vorteile.

Gruss Peter

Welche Vorteile z.B.?

Also es ist kein Websiteprojekt, sondern eine Webanwendung:
(VS2008) Datei->Neu->Projekt->Web->ASP.NET -Webanwendung.

Meinst Du das?
So habe ich das Projekt damals angelegt.

04.11.2009 - 10:16 Uhr

Hallo.
Ich habe des öfteren ein Problem mit dem o.g. Kompilerfehler.
Er kommt ab und zu und ohne, daß ich was machen verschwindet er wieder.
Ich komme mit dem Fehler nicht klar, da weder die eine angesprochene Datei, noch die andere irgendwo existiert.
Was der fehler bedeutet habe ich bei msdn nachgelesen, aber wie es aussieht nicht verstanden.

Das Steuerelement footer.ascx ist in jedem Webinhaltsformular, welches von der Masterpage abhängt selbstverständlich drin.
Das ist ja auch angesprochen.
Aber was sollen die Dateien App_Web_footer.ascx.cdcab7d2.iqvy8vbe.dll
und App_Web_ubwzipsv.dll denn sein?

Hier der Ausführliche Fehler:

Kompilierungsfehler
Beschreibung: Fehler bei der Kompilierung einer Ressource, die zur Verarbeitung dieser Anforderung erforderlich ist. Überprüfen Sie die folgenden spezifischen Fehlerdetails, und ändern Sie den Quellcode entsprechend.

Compilerfehlermeldung: CS0433: Der Typ "ASP.footer_ascx" ist sowohl in "c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\592760f1\cec509aa\App_Web_footer.ascx.cdcab7d2.iqvy8vbe.dll" als auch in "c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\592760f1\cec509aa\App_Web_ubwzipsv.dll" vorhanden.

Quellfehler:

Zeile 246:
Zeile 247: [System.Diagnostics.DebuggerNonUserCodeAttribute()]
Zeile 248: private globalASP.footer_ascx @__BuildControlFooterleiste() {
Zeile 249: global
ASP.footer_ascx @__ctrl;
Zeile 250:

Quelldatei: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\592760f1\cec509aa\App_Web_webform1.aspx.cdcab7d2.9xk2wg4t.0.cs Zeile: 248

Kann wer was dazu sagen?
Vielen Dank!