Laden...

Forenbeiträge von tikra Ingesamt 185 Beiträge

07.03.2011 - 14:03 Uhr

Hallo,

würde mich hier einfach mal anschließen wollen.

Folgendes Szenario:

  • AnwendungA liegt auf einem Netzlaufwerk und kann nur mit Administratorrechten gestartet werden

  • AnwendungB startet AnwendungA (liegt im selben Verzeichnis via Process.Start() und zugewiesenem Usernamen/Passwort mit lokalem Administrator-Konto

-> Verzeichnisname ist ungültig

Hier dachte ich, dass es evtl. daran liegt, dass der lokale Administrator keine Berechtigung auf das Netzlaufwerk hat, mit dem Domänenadministrator funktioniert es aber ebenfalls nicht...

Gut, dachte ich:

  • AnwendungB KOPIERT das gesamte Programmverzeichnis (Application.StartupPath) in %temp%\AppName und startet DORT AnwendungA mit den Administratorrechten

-> Verzeichnisname ist ungültig,

obwohl die Schreibzugriffe vorher durchgelaufen sind.

Es ist also scheinbar NICHT möglich den Ausführungskontext zu wechseln:

Lokal -> Remote bzw. Remote -> Lokal

Hat jemand eine Idee??

Der Kern sieht so aus:

string AdminDomain = "";
                    string AdminUser = "Administrator";
                    string AdminPwd = "pass";

                    SecureString AdminPwdSecure = new SecureString();
                    ProcessStartInfo p = new ProcessStartInfo();

                    if (AdminDomain.Trim() == "")
                        AdminDomain = SystemInformation.ComputerName.ToString();

                    foreach (char chr in AdminPwd.ToCharArray())
                        AdminPwdSecure.AppendChar(chr);

                    p.FileName = appPath;

                    p.Domain = AdminDomain;
                    p.UserName = AdminUser;
                    p.Password = AdminPwdSecure;

                    // Muss für die Ausführung unter einem anderem User auf false stehen.
                    p.UseShellExecute = false; 

                    Process.Start(p);
15.12.2010 - 14:32 Uhr

Nein, es ist schon eine Suppe (Webapplikation auf ASP.NET AJAX-Basis in Kombi. mit jQuery), GUI splitten brauche ich nicht mehr, das habe ich schon durch die Separierung in UserControls erzielt.

Aber dein Einwand bzgl. Applikationseinstellung ist vermutlich vollkommen richtig, nur muss ich es trotzdem nach unten hin verarbeiten können. Das hab ich jetzt wie gesagt mit integern auf DAL-Ebene gelöst und es funktioniert jetzt auch soweit, habe meine 38 Fehlermeldungen abgearbeitet. ^^

Vielen Dank.

15.12.2010 - 14:01 Uhr

Labels haben andere Inhalte, TreeView-Controls laden unterschiedliche Inhalte nach, usw.

Auf DAL-Ebene hat es Auswirkung auf den generierten Report / auf die Verdichtung der Daten.

15.12.2010 - 13:31 Uhr

Ich würde nicht das Design/GUI in Frage stellen wollen, sondern eher die Struktur meines DALs.

Innerhalb meiner DAL-Methoden baue ich SQLs zusammen und hier kommen die Modes/Enums ins Spiel, je nach Modus wird zur SQL-Abfrage etwas anderes hinzugefügt oder weggelassen (StringBuilder).

Jetzt könnte man natürlich im BLL den Modus abfragen und für jeden Modus eine eigene Methode im DAL anlegen, dann hätte ich aber relativ häufig die selben SQL-Bestandteile (Duplikate innerhalb der unterschiedlichen Methoden).

Ich tue mich sehr schwer damit, was ich wo, wie hinpacke und aufsplitte, merkt man das?

Hoffe du/ihr schreibt noch einmal ein paar Sätze dazu.

// Edit: Ich stelle mir auch schon länger die Frage, ob das zusammenbauen von SQL überhaupt in den DAL gehört? Einerseits ja, die Methoden liefern mir die strukturierten Daten, welche ich im BLL weiterverarbeite. Andererseits könnte man auch "nein" sagen, wenn im DAL ausschließlich Klassen für den DatenZUGRIFF abgelegt werden sollen. Kann jemand dazu vielleicht auch ein Statement abgeben?

15.12.2010 - 13:10 Uhr

Ist mir schon klar.

Nur diese "Modes" sind halt nicht nur für den Data Access relevant, sondern auch für einzelne UserControls, wie die Daten "anders" angezeigt werden bspw.


Shared:

  • nochmalig Strukturen aus dem Kontext reißen, was mich an der 3-Tier-Architektur an sich schon etwas gestört hat

Direkter Zugriff auf DAL:

  • Damit zerstört man doch fast den Sinn des Modells oder? Kommt aber auch wirklich auf konkrete Dinge an, manchmal geht es halt nicht anders oder man tunnelt die Methoden und erstellt sie nochmals im BLL, sodass die Aufrufe durchgeleitet werden.

Habe mich jetzt für eine dritte Variante entschieden:

Enums in den BLL und vom BLL an den DAL übergebe ich nur die int-Werte.

15.12.2010 - 11:52 Uhr

Ich würde mich hier gerne anschließen, da die letzten Postings exakt meiner Fragestellung matchen und hier liegt auch schon das Problem:

wenn du den enum in den DAL packst, wo er ja inhaltlich reingehört, dann steht er ja in den Schichten darüber zur Verfügung.

Vom Business Layer aus kann ich noch auf die im DAL definierten enums zugreifen, vom Presentation Layer aus allerdings nicht mehr:

(Fehlermeldung einer Klasse aus dem Presentation Layer)
"Der Typname 'MyEnum' ist im Typ 'MyBusinessLayer' nicht vorhanden"

Der Presentation Layer enthält keinen Verweis auf den DAL, dies ist von der Architektur her doch so gewollt und auch sinnig oder?

Wie muss ich meine Klasse und/oder meinen Enum deklarieren, sodass er im Presentation Layer zur Verfügung steht?

Kurzes Snippet, wie meine Struktur aussieht:



using BLL;

namespace GUI
{
    public class GUI
    {
         // BLL.DAL.Modes?! Wie zugreifen?
    }
}
______________________________________________

using DAL;

namespace BLL
{
    public class BLL
    {
         // DAL.Modes-Zugriff klappt.
    }
}

______________________________________________

namespace DAL
{
    public class DAL
    {
        public enum Modes
        {
            Standard = 1,
            NichtStandard = 2,
            NochWasAnderes = 3
        }
    }
}


07.12.2010 - 12:19 Uhr

Wie finde ich das heraus?

Und wenn ich dies weiß, wie hole ich mir die entsprechenden Rechte?

07.12.2010 - 12:07 Uhr

Hallo,

wir müssen für ein Image während des Startups von Windows (7) das Windows automatisiert aktivieren.

Normalerweise würden wir "slmgr /ato" nutzen.

Nun ist dies natürlich nur mit Administratorrechten möglich, für diese Fälle habe ich ein vorgestricktes Programm, welches einen Batchfile mit einem entsprechenden Adminkonto ausführt, dies schlägt diesmal jedoch fehlt. Trotz alle dem wirft das VB-Script die Fehlermeldung aus, dass es erhöhte Rechte benötigt.

Habt ihr vielleicht noch eine Idee? Bin mittlerweile ratlos...

Hier der Code, falls diese Lösung doch noch in Frage komm?


static void Main(string[] args)
        {
            try
            {
                string FileCscriptPath = @"test.bat";
                
                //string FilePath = @"C:\Windows\System32\slmgr";
                //string FileArgs = "/ato";
                ////string FileHash = "5a4a7f261307721656c11b5cc097cde1cf791073";

                //if (!File.Exists(FileCscriptPath))
                //    throw new Exception("Executioner nicht gefunden.");

                //if (!File.Exists(FilePath))
                //    throw new Exception("Die VB-Scriptdatei zur Aktivierung konnte nicht gefunden werden.");

                //else if (Hash.SHA1.GetFromFile(FilePath) != FileHash)
                //    throw new Exception("Die VB-Scriptdatei hat nicht den erwarteten Inhalt und wird nicht ausgeführt.");

                //else
                //{
                    string Domain = "";
                    string Username = "Administrator";
                    string Password = "xyz123";

                    SecureString SecurePassword = new SecureString();
                    ProcessStartInfo p = new ProcessStartInfo();

                    if (Domain.Trim() == "")
                        Domain = SystemInformation.ComputerName.ToString();

                    foreach (char chr in Password.ToCharArray())
                        SecurePassword.AppendChar(chr);

                    p.FileName = FileCscriptPath; 
                    //p.Arguments = FilePath + " " + FileArgs;
                    p.Domain = Domain;
                    p.UserName = Username;
                    p.Password = SecurePassword;

                    // Muss für die Ausführung unter einem anderem User auf false stehen.
                    p.UseShellExecute = false;

                    Process.Start(p);
                //}
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Aktivierungsfehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

02.12.2010 - 15:43 Uhr

Okay, sorry.

Trotzdem ist es hiermit etwas besser dokumentiert, wie ich finde.

02.12.2010 - 15:33 Uhr

Mit zusätzlicher Methode (+1 Überladung):

02.12.2010 - 15:32 Uhr

Damals hatte ich die Page mit den Erweiterungsmethoden (Extension Methods) nicht verstanden, dies ist jetzt schon der Fall und deswegen will ich das hier noch einmal dokumentieren, damit es vielleicht etwas besser verständlich wird.

Hierzu siehe Screenshots. Mehr braucht es nicht, um das zu verstehen

(Außer das die Klasse in welcher sich die statische Methode befindet ebenfalls statisch sein muss und das sich der Namespace der Klasse im selben Namespace wo man es nutzen möchte befinden muss, bzw. bindet diesen via using ein.)

19.10.2010 - 08:32 Uhr

Ich muss leider nochmal stören. Fakt ist, dass es mit deinem Ansatz auf jeden Fall funktionieren muss. Jetzt geht es nur noch um die Umsetzung, eigentlich mag ich diese "Pixelzählerei" nicht, hier ist sie allerdings leider nötig:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
        <meta http-equiv="Content-Style-Type" content="text/css" />

        <title>An XHTML 1.0 Strict Template</title>

        <style type="text/css">
        
            table
            {
                border: 1px solid red;
            }
            
            td
            {
                border: 1px dashed black;
            }
        </style>

        <script type="text/javascript">
        
            // function test3()
            // {
                // var tblTop = document.getElementById("top");

                // tblTop.rows[0].cells[0].width = tblTop.rows[0].cells[0].offsetWidth + 15;
            // }
            
            // function test4()
            // {
                // var tblTop = document.getElementById("top");
                
                // var newCellWidth = tblTop.rows[0].cells[0].offsetWidth + 25;
                // var newtblTopWidth = tblTop.offsetWidth + 25;
                
                // tblTop.rows[0].cells[0].style.width = newCellWidth + "px";
                // tblTop.style.width = newtblTopWidth + "px";
            // }
            
            // function test5()
            // {
                // var tblTop = document.getElementById("top");
                
                // var newCellWidth = tblTop.rows[0].cells[0].offsetWidth + 25;
                // var newtblTopWidth = tblTop.offsetWidth + 25;
                
                
                // tblTop.width = tblTop.offsetWidth + 25;
                // tblTop.rows[0].cells[0].width = tblTop.rows[0].cells[0].offsetWidth + 25;
            // }
            
            function test6()
            {
                var tblTop = document.getElementById("top");
                var tblBottom = document.getElementById("bottom");
                
                var colTop, colBottom;
                
                for (var i = 0; i < tblTop.rows[0].cells.length; i++)
                {
                    colTop = tblTop.rows[0].cells[i];
                    colBottom = tblBottom.rows[0].cells[i];
                    
                    // Obere Spalte ist kleiner.
                    if (colTop.offsetWidth < colBottom.offsetWidth)
                    {
                        tblTop.width = tblTop.offsetWidth + (colBottom.offsetWidth - colTop.offsetWidth);
                        
                        colTop.width = colBottom.offsetWidth;
                        colBottom.width = colBottom.offsetWidth;
                    }

                    // Untere Spalte ist kleiner.
                    else
                    {
                        colBottom.width = colTop.offsetWidth;
                        //colTop.width = colTop.offsetWidth;
                    }
                    
                    tblBottom.width = tblTop.offsetWidth;
                    tblTop.width = tblTop.offsetWidth;
                    
                    // if (tblTop.offsetWidth < tblBottom.offsetWidth)
                    // {
                        // alert('Tabelle oben kleiner -> oben width von unten setzen');
                        // tblTop.width = tblBottom.offsetWidth+15;
                        // tblBottom.width = tblBottom.offsetWidth+15;
                    // }
                    
                    // else
                    // {
                        // alert('Tabelle unten kleiner -> unten width von oben setzen');
                        // tblBottom.width = tblTop.offsetWidth+15;
                        // tblTop.width = tblTop.offsetWidth+15;
                    // }
                }
            }
            
        </script>
        
    </head>

    <body>

        <table id="top">
        
            <tr>
            
                <td>1</td>
                <td>22</td>
                <td>333</td>
                <td>4444</td>
                <td>55555</td>
                <td>666666</td>
                <td>1</td>
                <td>22</td>
                <td>333</td>
                <td>4444</td>
                <td>55555</td>
                <td>666666</td>
                <td>1</td>
                <td>22</td>
                <td>333</td>
                <td>4444</td>
                <td>55555</td>
                <td>666666</td>
                
            </tr>
            
            <tr>
            
                <td>1ssssssssss</td>
                <td>22sssssssss</td>
                <td>33ssssssssssssss3</td>
                <td>4444</td>
                <td>55555</td>
                <td>666666</td>
                <td>1ssssssssss</td>
                <td>22sssssssss</td>
                <td>33ssssssssssssss3</td>
                <td>4444</td>
                <td>55555</td>
                <td>666666</td>
                <td>1ssssssssss</td>
                <td>22sssssssss</td>
                <td>33ssssssssssssss3</td>
                <td>4444</td>
                <td>55555</td>
                <td>666666</td>
                
            </tr>

        </table>

        <br />
        
        <table id="bottom">

            <tr>
            
                <td>666666</td>
                <td>55555</td>
                <td>4444</td>
                <td>333</td>
                <td>22</td>
                <td>1</td>
                <td>666666</td>
                <td>55555</td>
                <td>4444</td>
                <td>333</td>
                <td>22</td>
                <td>1</td>
                <td>666666</td>
                <td>55555</td>
                <td>4444</td>
                <td>333</td>
                <td>22</td>
                <td>1</td>
                
            </tr>
            
            <tr>
            
                <td>1</td>
                <td>22</td>
                <td>333</td>
                <td>4444</td>
                <td>55555</td>
                <td>666666</td>
                <td>1</td>
                <td>22</td>
                <td>333</td>
                <td>4444</td>
                <td>55555</td>
                <td>666666</td>
                <td>1</td>
                <td>22</td>
                <td>333</td>
                <td>4444</td>
                <td>55555</td>
                <td>666666</td>
                
            </tr>
        
        </table>

        <br />
        
        <input type="button" Value="Synchronisieren" onclick="test6()" />

    </body>

</html>

Wird der untere Teil, welcher auskommentiert ist genutzt und nicht der obere, dann funktioniert es, ist aber viel zu viel ungenutzter Platz der generiert wird.

Wo liegt mein Fehler?

18.10.2010 - 14:26 Uhr

Au weia, du bist der Knaller. Ich danke dir! 😃

Edit: Falls du das noch liest, wieso verwendest du nun offsetWidth und nicht clientWidth? Unterschied?

11.10.2010 - 08:00 Uhr

Vielen Dank, hilft schon einmal sehr weiter. 😃

Hast du mal obiges Script ausprobiert? Die Tabelle wird ab dem Punkt, wo der rechte Border rechts "andockt" nicht mehr größer, genau das Problem hätte ich auch in dem Script um die Spalten anzugleichen.

Wenn ich .DataBind() ausführe und das GridView angezeigt wird, DANN kann er die Seite nach rechts "verlängern" und es wird ein horizontaler Scrollbalken sichtbar.
Wenn ich die Spalten dieser Tabelle nun via JavaScript vergrößern will, ist keine Änderung zu sehen.

Danke & Gruß

timmi

08.10.2010 - 17:56 Uhr

Okay, mal angenommen ich wüßte wie es geht - und wir blenden die oben beschrieben Problematik, dass ich .width nicht setzen kann, da der Fensterplatz bereits ausgefüllt ist (er ignoriert das Statement dann, wie das html-Beispiel zeigt) - WIE löse ich dieses Script nach dem erfolgreichen PostBack aus?

Muss ich da so eine JavaScript-Injection im Codebehind machen?

08.10.2010 - 13:11 Uhr

Hallo,

ich habe 2 Tabellen, die zunächst via Auge miteinander verglichen werden sollen.
Hierzu ist es wichtig, dass die Spalten direkt untereinander stehen.

Hinter diesen 2 Tabellen stehen 2 GridViews, welche mittels DataTable/DataBind gefüttert werden. Ich bin nicht in der Lage jeder Spalten 100 oder 200px zuzuweisen, da es sehr viele Spalten sind und der Platz wichtig ist.

Ich habe mich schon mit serverseitigen und clientseitigen Lösungen auseinander gesetzt.

Wobei ich nicht weiß, wie ich den "Finished"-Status eines PostBacks abfangen könnte, um dann den entsprechenden JavaScript-Spaltenalgorithmus zu feuern.

Anyway: Beide Ansätze laufen auf das selbe Problem: Ist die width/Breite "aufgebraucht" die zur Verfügung steht, lässt sich die Tabelle nicht mehr weiter durch .width-Argumente vergrößern.

Kleines html-Beispiel (solange auf + clicken, bis Ende des Screens erreicht):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
        <meta http-equiv="Content-Style-Type" content="text/css" />
        
        <title>An XHTML 1.0 Strict Template</title>
        
        <style type="text/css">
            td {
                border: 1px solid black;
            }
        </style>
        
        <script type="text/javascript">
        function test3() {
            var table = document.getElementById("mytable");
            
            table.rows[0].cells[0].width = table.rows[0].cells[0].clientWidth + 15;
        }
        </script>
    </head>

    <body>
    
        <table id="mytable">
            <tr><td>eidfdfdfdfdfdfdffdns</td><td>fdfdfdfdfdfdfdfdfdfdzwei ssssdrei</td></tr>
            <tr><td>eidfdfdfdfdfdfdffdns</td><td>fdfdfdfdfdfdfdfdfdfdzwei ssssdrei</td></tr>
            <tr><td>eisns</td><td>zwei drei</td></tr>
        </table>
        
        <table id="mytable2">
            <tr><td>einsdsdss</td><td>zweidsdsd drei</td></tr>
            <tr><td>esssins</td><td>zwei ddsdsdsrei</td></tr>
        </table>
        
        <input type="button" Value="+" onclick="test3()" />
    
    </body>

</html>

Der Vorteil der clientseitigen Lösung liegt darin, dass man die tatsächliche Spaltenbreite mittels clientWidth auslesen kann, auch ohne das eine Breite gesetzt wurde.
Dies ist mit der serverseitigen Lösung mittels

gridView.Rows[0].Cells[0].Width

natürlich nicht möglich. Dort müsste man es unschön über die Anzahl von Buchstaben * fixe Pixel Anzahl ausrechnen, dies wäre allerdings nicht genau, unschön und deckt AUCH NICHT das Problem der Headerzeile ab, welchen zum größten Teil Titel beinhalten, welche einen wrap beinhalten...

Hoffe ich konnte vermitteln, was mein Problem ist.

Mal schauen ob dort jemand eine Idee zu hat.

Schönes Wochenende schon einmal euch allen!

08.10.2010 - 08:06 Uhr

jaja, das CSS kann einen manchmal schon Nerven kosten 😉

Ja, wem sagst du das... da hat man sowieso Projektstress und dann muss man sich mit solchen Kleinigkeiten rumschlagen, die u. U. wahnsinnig Zeit fressen können...

Vielen Dank auf alle Fälle, es funktionuckelt. 👍 🙂

08.10.2010 - 08:05 Uhr

Bist du sich, dass das funktioniert?

Wenn ich via DataSource/DataBind gehe gibt es diese Footer-Parameter doch gar nicht und kann dementsprechend auch nicht abgefragt werden oder sehe ich das falsch?
Oder ist die letzte Zeile einer DataTable automatisch immer ein Footer?

Meine entgültige Lösung, falls es noch irgendjemand mal benötigt:

        protected void gvReport_DataBound(object sender, EventArgs e)
        {
            GridView gv = (GridView)sender;

            Table tbl = (Table)gv.Rows[0].Parent;

            for (int i = 0; i < gv.Rows.Count; i++)
            {
                if (gv.Rows[i].Cells[1].Text == "Summe")
                {
                    tbl.Rows.AddAt(gv.Rows.Count + 1, gv.Rows[i]);
                    break;
                }
            }
        }

Intern wird mit Sicherheit mit Pointern gearbeitet und dieser wird dann einfach "umgebogen" und an die entsprechende Stelle gesetzt.

07.10.2010 - 15:08 Uhr

Nein, ich denke erstmal nicht. Habe ich auch schon drüber nachgedacht, habe es aber nicht wirklich hinbekommen, hier ein Snippet für die GridView-Bearbeitung, falls dir ein paar Syntaxelemente aus dem Kopf heraus fehlen, es funktioniert so nicht, aber hab's grad zur Hand:


			//GridViewRow gvr = new GridViewRow(-1, -1, DataControlRowType.DataRow, DataControlRowState.Normal);
					  //DataControlRowType.Footer


            Table tbl = (Table)gv.Rows[0].Parent;
            GridViewRow gvr2 = null;
            for (int i = 0; i < gv.Rows.Count; i++)
            {

                if (gv.Rows[i].Cells[0].Text == "Summe")
                {
                    gvr2 = gv.Rows[i];
                    //gv.DeleteRow(i); // Exception...

                    break;
                }
                    
            }

            if (gvr2 != null)
            {
                
                tbl.Rows.AddAt(gv.Rows.Count + 1, gvr2);
            }

Edit: (Okay, es scheint doch zu funktionieren, allerdings OHNE die Zeile zu löschen. Das zuweisen/zwischenspeichern von gvr2 und nochmalige adden mittels AddAt hat quasi ein "Verschieben" des Elements zur Folge. Das wundert mich...

07.10.2010 - 14:56 Uhr

Binden mit .DataSource = dataTable und .DataBind(). Keine vordefinierten Felder da es eine sehr dynamische Tabelle ist.

Tabelle mit 2 Spalten

Name Wert

Günther 1,0
Timm 2,0
Summe 3,0

Nach der Sortierung nach dem Namen:

Name Wert

Günther 1,0
Summe 3,0
Timm 2,0

-> Die Tabelle soll sortiert werden, die Summe soll allerdings weiterhin als letzte Zeile unten stehen.

07.10.2010 - 14:39 Uhr

Hallo,

ich habe eine DataTable, welche eine Summenzeile mit Namen "Summe" beinhaltet, diese sortiere ich mittels dataTable.DefaultView.Sort.

Bei dieser Sortierung wird allerdings die Summenzeile "wild" mit sortiert und taucht dann irgendwo mittendrin in der Tabelle auf, nachdem ich sie an ein GridView (Webapplikation) gebunden habe.

Mein Basisansatz ist eben diese Summenzeile zu suchen, zu entfernen und mit ImportRow oder InsertAt ans Ende der DataTable wieder einzufügen.


protected void gvReport_Sorting(object sender, GridViewSortEventArgs e)
        {
            GridView gv = (GridView)sender;
            DataTable dt = (DataTable)gv.DataSource;

            if (dt != null)
            {
                // Daten sortieren.
                dt.DefaultView.Sort = e.SortExpression;
                //if (e.SortDirection == SortDirection.Ascending)
                //    dt.DefaultView.Sort += " ASC";
                //else
                    dt.DefaultView.Sort += " DESC";

                    
                    DataRow dr = dt.NewRow();
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        if (dt.Rows[i]["Name"].ToString() == "Summe")
                        {
                            dr.ItemArray = dt.Rows[i].ItemArray;
                            dt.Rows[i].Delete();

                            break;
                        }
                    }

                    dt.Rows.InsertAt(dr, dt.Rows.Count);

                // Sortierte DataTable wieder an das GridView binden.
                gv.DataSource = dt;
                gv.DataBind();
            }
        }

Dies funktioniert allerdings nicht, da sich die hinzugefügte Zeile immer wieder passend einsortiert...

Ist es über diesen Weg ÜBERHAUPT möglich?

Mittlerweile habe ich diesen Ansatz verworfen, versuche aber über die selbe Idee das entsprechende GridView dann zu bearbeiten (DataBound-Ereignis), ich fürchte hier sieht es nicht besser aus.

Geht es einfacher? Geht es überhaupt? Bin am verzweifeln...

Vielen Dank!

07.10.2010 - 11:56 Uhr

Das obere Beispiel ist nicht aussagekräftig und nicht vergleichbar.

Es WÜRDE nun zwar funktionieren, wenn das Menü sich erweitert, wenn aber der Content-Bereich sich erweitert, bleibt das Menü ebenfalls wieder statisch:

(Abwechselnd auf root- und child-Elemente klicken um hinzuzufügen.)

Codebehind:

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                TreeView1.Nodes.Add(new TreeNode("root"));
                TreeView2.Nodes.Add(new TreeNode("root2"));
            }
        }

        protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
        {
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView1.Nodes[0].ChildNodes.Add(new TreeNode("child"));

        }

        protected void TreeView2_SelectedNodeChanged(object sender, EventArgs e)
        {
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));
            TreeView2.Nodes[0].ChildNodes.Add(new TreeNode("child"));

        }
    }
}

Markup:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Unbenannte Seite</title>
    <style type="text/css">
        #menu
        {
            background-color: #e8f2ff;
            border-right: 1px solid #2375af;
            width: 360px;
            position: absolute;
            top: 60px;
            left: 0px;
            min-height: 100%;
        }
        #content
        {
            background-color: White;
            padding-left: 10px;
            position: absolute;
            top: 75px;
            left: 375px;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
    </asp:ToolkitScriptManager>
    <div id="menu">
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <asp:TreeView ID="TreeView1" runat="server" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged">
                </asp:TreeView>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    <div id="content">
        <asp:UpdatePanel ID="UpdatePanel2" runat="server">
            <ContentTemplate>
                <asp:TreeView ID="TreeView2" runat="server" OnSelectedNodeChanged="TreeView2_SelectedNodeChanged">
                </asp:TreeView>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    </form>
</body>
</html>

07.10.2010 - 08:56 Uhr

Hi, es tritt sogar ohne irgendwelches Nachladen oder UpdatePanels auf und mit "height: 100%" funktioniert es ebenfalls nicht, denke es ist ein einfacher HTML-/CSS-Fehler:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Unbenannte Seite</title>
    
    <style type="text/css">
    
        #menu
        {
            background-color: #e8f2ff;
            
            border-right: 1px solid #2375af;
            width: 360px;
            
            position: absolute;
            top: 60px;
            left: 0px;
            bottom: 0px;
        }    
    
    </style>
    
</head>
<body>
    <form id="form1" runat="server">
    <div id="menu">
        
        <asp:TreeView ID="TreeView1" runat="server">
            <Nodes>
                <asp:TreeNode Text="Neuer Knoten" Value="Neuer Knoten">
                    <asp:TreeNode Text="Neuer Knoten" Value="Neuer Knoten"></asp:TreeNode>
                    <asp:TreeNode Text="Neuer Knoten" Value="Neuer Knoten"></asp:TreeNode>
                    // n-Knoten (copy & paste), bis sie über den Bildschirmrand hinaus ragen.
                </asp:TreeNode>
            </Nodes>
        </asp:TreeView>
        
    </div>
    </form>
</body>
</html>

Edit: Mit margin: 0px erweitert er die background-color zwar passend zum Inhalt, damit ist das Problem aber quasi nur umgekehrt vorhanden... wenn der Inhalt zu "kurz" ist, wird die background-color nicht über den gesamten sichtbaren Bereich "aufgetragen".

Edit 2: Falscher Alarm, min-height funktioniert ebenfalls nicht.

06.10.2010 - 12:59 Uhr

Hallo,

ich habe folgendes Problem: In einem Div-Container, welcher sich als eine Art Menü auf der linken Seite erstreckt befindet sich ein TreeView-Element in einem UpdatePanel (neben anderen UpdatePanels). Expandiere ich nun ein Element innerhalb dieses UpdatePanels und ragt es über die zur Verfügung stehende Auflösung nach unten hinaus, so habe ich die Möglichkeit nach unten zu scrollen, dieser neu gewonnene Platz wird allerdings nicht mit durch den Style des Div-Containers gerendert (Hintergrund + rechter Rand zur Abgrenzung des Menüs).

Eine Lösung wäre mit Sicherheit um das gesamte Div-Menü-Element ein UpdatePanel zu legen und dies via .Update() neu rendern zu lassen, das kann allerdings doch nicht des Rätsels Lösung sein und finde ich auch alles andere als elegant, vor allem würde dies doch auch die (nicht benötigten) zu übertragenen Daten erhöhen.

Anhang: Vor der Expansion.

22.09.2010 - 11:19 Uhr

Hat sich erledigt, folgende Seite hat geholfen:

http://geekswithblogs.net/mnf/archive/2005/11/04/59081.aspx

Lösung: Der __EVENTTARGET-Parameter der __doPostBack-Methode muss bei UserControls wie folgt angesprochen werden: UserControl$ControlIdEinesUserControlElements

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
<%@ Register Src="~/WebUserControl1.ascx" TagName="test" TagPrefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Unbenannte Seite</title>

    <script>
    
        function doCheckBoxPostBack(e)
        {
            var event = window.event ? window.event.srcElement : e.target;
            
            if (event.tagName == "INPUT" && event.type == "checkbox")
                __doPostBack("meintest$Label1", "");
        }
    
    </script>

</head>
<body>
    <form id="form1" runat="server">
    <asp:ToolkitScriptManager ID="ToolkitScriptManager1" runat="server">
    </asp:ToolkitScriptManager>
    <div>
        <uc1:test id="meintest" runat="server" />
        <asp:Label ID="Label2" runat="server" Text="Label2"></asp:Label>
    </div>
    </form>
</body>
</html>

WebUserControl1.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs"
    Inherits="WebApplication1.WebUserControl1" %>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:TreeView ID="TreeView1" runat="server" OnSelectedNodeChanged="TreeView1_SelectedNodeChanged"
            OnTreeNodeCollapsed="TreeView1_TreeNodeCollapsed" onclick="doCheckBoxPostBack(event)"
            OnTreeNodeExpanded="TreeView1_TreeNodeExpanded" ShowCheckBoxes="All" 
            ontreenodecheckchanged="TreeView1_TreeNodeCheckChanged">
            <Nodes>
                <asp:TreeNode Text="a" Value="a">
                    <asp:TreeNode Text="aa" Value="aa"></asp:TreeNode>
                    <asp:TreeNode Text="ab" Value="ab"></asp:TreeNode>
                    <asp:TreeNode Text="ac" Value="ac"></asp:TreeNode>
                </asp:TreeNode>
                <asp:TreeNode Text="b" Value="b">
                    <asp:TreeNode Text="ba" Value="ba"></asp:TreeNode>
                    <asp:TreeNode Text="bb" Value="bb"></asp:TreeNode>
                    <asp:TreeNode Text="bc" Value="bc"></asp:TreeNode>
                </asp:TreeNode>
                <asp:TreeNode Text="c" Value="c">
                    <asp:TreeNode Text="ca" Value="ca"></asp:TreeNode>
                    <asp:TreeNode Text="cb" Value="cb"></asp:TreeNode>
                    <asp:TreeNode Text="cc" Value="cc"></asp:TreeNode>
                </asp:TreeNode>
            </Nodes>
        </asp:TreeView>
        <asp:Label ID="Label1" runat="server" Text="Label1"></asp:Label>
    </ContentTemplate>
</asp:UpdatePanel>

22.09.2010 - 09:42 Uhr

Mein User Control sieht wie folgt aus (irrelevante Dinge gekürzt):

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Tree.ascx.cs" Inherits="Proj.Tree" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="asp" %>
<asp:UpdatePanel ID="upTree" runat="server" UpdateMode="Conditional">
    <ContentTemplate>

            [...]

            <asp:TreeView ID="tv" runat="server" ShowCheckBoxes="All" ShowLines="false" onclick="doCheckBoxPostBack(event)"
                OnSelectedNodeChanged="tv_SelectedNodeChanged" OnTreeNodeExpanded="tv_TreeNodeExpanded"
                OnTreeNodeCheckChanged="tv_TreeNodeCheckChanged">
                <RootNodeStyle Font-Bold="true" />
            </asp:TreeView>
            
            [...]

        </asp:Panel>
    </ContentTemplate>
</asp:UpdatePanel>

Das "Besondere" hier ist, dass ich beim onclick-Event eine eigene doPostBack-Methode aufrufe, diese sieht wie folgt aus:

function doCheckBoxPostBack(e)
{
    var event = window.event ? window.event.srcElement : e.target;
    
    if (event.tagName == "INPUT" && event.type == "checkbox")
        __doPostBack("", "");
}

Wenn also eine Checkbox des TreeViews aktiviert/deaktiviert wurde führe ich die __doPostBack-Methode manuell auf.
Der Grund: Beim diesem Event wird leider kein automatischer PostBack durchgeführt, erst beim (Beispiel) expandieren eines Knotens wird dieser Event mit abgewickelt (warum auch immer).

Mein Problem ist jetzt, dass wenn ich eine Checkbox aktiviere ein Full PostBack der Seite durchgeführt wird, anstatt eines Partial PostBacks.

Als ich das TreeView und die Restlichen Controls des User Controls noch innerhalb der Default.aspx platziert hatte trat dieses Problem nicht auf, es verhielt sich so, wie ich es angedacht hatte: Partial PostBack.

Ich verrenne mich mit meinen Gedanken, je mehr ich darüber nachdenke, hat jemand evtl. eine neue Idee oder gar eine Lösung zu diesem Phänomen?

Vielen Dank

timmi

Edit: Glaube es hat etwas mit den Argumente zu tun, welche ich an die __doPostBack-Methode übergebe, wenn der erste Parameter der Name eines bekannten Controls ist, wird kein Full PostBack ausgeführt. Leider kann ich dies nicht auf mein User Control replizieren. Weder ein ID-/Control-Name aus der Default.aspx, noch einer aus dem UserControl.ascx zeigen eine Änderung.

Edit 2: Referenz welches ebenfalls mein Problem beschreibt, nur eben ohne die User Control-Problematik: http://forums.asp.net/p/1087628/4091989.aspx#4091989

13.09.2010 - 15:25 Uhr

Hallo,

Ändere ich nun ein Steuerelement, welches einen Partial-PostBack innerhalb des UpdatePanels durchführt werden (verständlicherweise) diese clientseitigen Änderungen überschrieben.
Das sollte doch kein Problem darstellen - du bekommst doch im PostBack mit welcher Radiobutton gesetzt ist, und könntest also serverseittig dementsprechend die gewünschten Elemente aktivieren/deaktivieren.

Die RadioButtons sind keine ASP-Elemente, reines html (finde es unnötig für mein Vorhaben dafür einen PostBack durchzuführen, sowas sollte man clientseitig halten können), ich reagiere bei einem Klick auf diese mit Farbänderungen und diese Farbänderungen werden bei einem PostBack überschrieben.

13.09.2010 - 13:36 Uhr

Andere Meinungen? Kann man das tatsächlich so stehen lassen?

Ich denke du willst eher darauf hinaus, UpdatePanels eher nicht zu benutzen und lieber mit WebMethods zu arbeiten oder?

Dies ist allerdings in diesem Stadium nicht mehr möglich, evtl. in zukünftigen Projekten,
wenn ich UpdatePanels SOWIESO verwende, dann wirkt sich die "Stückelung" in kleinere glaube ich nicht negativ aus oder? Die Daten, welche gesendet werden reduzieren sich ja eigentlich dadurch.

13.09.2010 - 08:52 Uhr

Vom AjaxControlToolkit wollte ich jetzt erst einmal gar nicht sprechen, ich meinte die "normalen" UpdatePanels, keine TabPanels.

13.09.2010 - 08:31 Uhr

Hallo,

ich habe folgendes Problem:

Ich habe in einem UpdatePanel 2 html-RadioBoxen, klicke ich auf die eine, so wird ein Teil des Formulars farbtechnische ausgegraut (clientseitig mittels JavaScript), klicke ich auf die andere passiert das inverse.
Ändere ich nun ein Steuerelement, welches einen Partial-PostBack innerhalb des UpdatePanels durchführt werden (verständlicherweise) diese clientseitigen Änderungen überschrieben.

Meine Überlegung: Ich könnte die UpdatePanels "kleiner" gestalten und nur um die serverseitigen Steuerelemente legen, d.h. nur deren Inhalte/Styles würden neu geschrieben.

Meine Frage: Gibt es irgendwelche Nachteile (Performance?), wenn ich so "viele kleine" UpdatePanels erzeuge?

Ich spreche in meinem Fall von 2 TextBoxen, und 4 DropDownLists, diese würde ich dann anstatt einem großen UpdatePanel in 3 kleine unterteilen.

Vielen Dank!

Gruß

timmi

10.09.2010 - 12:30 Uhr

Vielen Dank für deine Ideen, klingt sehr gut! 😃

10.09.2010 - 08:23 Uhr

Klar, kein Problem:

Beim initialen Aufruf der Seite ist ein Panel (welches sich wiederum in einem UpdatePanel befindet) nicht sichtbar (Visible = false).

Durch div. Änderungen an einigen Steuerelementen (TextBoxen, DropDownLists, etc.) welche einen AutoPostBack durchführen soll dieses Panel nun sichtbar gemacht werden (Visible = true), allerdings nicht einfach nur "hingeklatscht", sondern wie schon gesagt mit einem jQuery-fadeIn.

Verständlicher?

Und mit "event-technisch" meinte ich, dass ich ja z. B. keine onload-Funktion von JavaScript bspw. nutzen und abfragen kann, ob das Panel nun visible (oder bei deiner Variante 'display: none' ) ist, da ja kein kompletter PostBack durchgeführt wird und somit diese Funktion nicht ausgeführt wird.

09.09.2010 - 16:22 Uhr

Okay, schon einmal der erste Schritt.

Aber wie kriege ich dies event-technisch mit, um darauf mit den Effekten zu reagieren?

09.09.2010 - 11:24 Uhr

Hi,

kurze Frage: Ist es möglich einen jQuery-Ein/Ausblendeeffekt zu starten, wenn serverseitig ein Panel auf visible = false/true gesetzt wurde?

Natürlich könnte ich die Logik, welche zum visible = false/true führt ebenfalls javascript-technisch implementieren, diese Methode würde ich allerdings nur ungern vorziehen, da es quasi doppelte Arbeit ist.

Gibt es also eine schönere Variante?

MfG

timmi

02.06.2010 - 11:34 Uhr

Super, ich wende mich doch nicht an euch, wenn ich es selber hinbekommen würde oder?

Ich sitze da schon Stunden drüber und komme einfach nicht dahinter!!

Wie erklärst du dir dieses Phänomen:

rowSum[z + 1] = dblarrSummenZeile[z].ToString("f1") + " " + dblarrSummenZeile[z].ToString("f1", ci);

Ausgabe: 329.0 329,0

rowSum[z + 1] = dblarrSummenZeile[z].ToString("f1", ci);

Ausgabe: 3290,0
01.06.2010 - 07:46 Uhr

Joah, funktioniert - wie auch andere Varianten - wunderbar, bis auf ≥ 1000.

Bei einem Doublewert von 1402.0 bekomme ich:

14.020,0

31.05.2010 - 20:01 Uhr

Nein, bei uns hat es keinen speziellen Grund.

Ich kann es leider nicht mehr testen, aber ich vermute jetzt mal, dass .NumberFormat den selben Effekt liefert, wie als wenn ich nur CultureInfo.CreateSpecificCulture benutze...

31.05.2010 - 17:16 Uhr

Ja, es dient ausschließlich der Anzeige, die Rechenarbeiten werden alle mit double-Datentypen gemacht.

Hoffe du schaust meinen editierten, letzten Post noch einmal an.

31.05.2010 - 17:01 Uhr

Oh man und ich dachte es würde an mir liegen, wieso wird einem denn eine so simple Aufgabe so schwierig gemacht?!?

Da ist es ja noch einfacher mit String.Replace(".", ",") zu arbeiten...

Edit: Funktioniert leider auch nicht, Ausgabe:

1,402.0

Was ich haben will:

1402,0 (deutsches Format)

31.05.2010 - 16:18 Uhr

@frisch: Ja, ich weiß,... ich wollte einfach alle Kombinationen und Permutationen ausprobieren, zwischendurch kommt dann so ein Müll dann dabei raus, ich habe einfach Copy & Paste genutzt, hätte ich vielleicht vorher rauslöschen sollen.

@frisch: Da kommt jetzt was seltsames raus, die Ausgabe sieht so aus:

#,##0.#

31.05.2010 - 15:59 Uhr
double[] darrSummenZeile = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
CultureInfo ci = CultureInfo.CreateSpecificCulture("de-DE");
31.05.2010 - 14:07 Uhr

Hallo,

ich verzweifle bald, Stunden habe ich mit nur dieser einen Zeile verbracht!!

99% der Zahlen werden korrekt dargestellt/konvertiert, eine einzige Zahl macht mir Bauchschmerzen. Die Besonderheit dieser Zahl ist, dass sie ≥ 1000 (vierstellig) ist.

WENN mein Komma als Dezimalzeichen richtig angezeigt wird und auch nur EINE Dezimalziffer da ist, dann zerreißt es IMMER meine "1402.0", hier verschiebt sich die Dezimalstelle nach rechts und es wird "14020,0" angezeigt.

Kann mir jemand weiterhelfen? Ich bin mit meinem Latein am Ende (obwohl der Spruch an dieser Stelle falsch ist, denn ich kann gar kein Latein! 😉 ).

double[] darrSummenZeile = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
CultureInfo ci = CultureInfo.CreateSpecificCulture("de-DE");
                rowSum[z + 1] = darrSummenZeile[z].ToString("#,#.#", ci.NumberFormat);
                rowSum[z + 1] = Convert.ToDecimal(darrSummenZeile[z]);
                rowSum[z + 1] = String.Format(ci, "{0:f1}", darrSummenZeile[z].ToString(CultureInfo.InvariantCulture.NumberFormat)); // 1402
                rowSum[z + 1] = String.Format(ci, "{0:n1}", Convert.ToDecimal(darrSummenZeile[z])); // 14.020,0
                rowSum[z + 1] = String.Format(ci, "{0:f1}", darrSummenZeile[z]); // 14020,0
                rowSum[z + 1] = String.Format(CultureInfo.InvariantCulture.NumberFormat,"{0:f1}", darrSummenZeile[z].ToString(ci.NumberFormat));
                rowSum[z + 1] = darrSummenZeile[z].ToString("#.0", ci.NumberFormat);
                rowSum[z + 1] = darrSummenZeile[z].ToString("N2", ci);

Keines dieser Lösungen führt zum Ziel.

Vielen Dank!

timmi

03.05.2010 - 13:03 Uhr

Ja, die sind alle raus. Es hat aber auch 100%-ig nichts mit unserer Änderung zu tun, deswegen auch ein neuer Thread!

Das Problem gab es vorher schon (vorher war es mir nur "egal", weil der Benutzer nichts davon mitbekommen hat). Ich habe die Vermutung, dass die Ursache dieses Problems im ToolkitScriptManager (ASP.NET AJAX Control Toolkit) steckt. Als ich noch mit dem standardmäßigen ScriptManager gearbeitet habe, trat dieses Problem noch nicht auf.

Ich führe bei einem Submit natürlich mehrere Änderungen am Formular durch ddl.Items.Clear(), Farben, aktivieren/deaktivieren, ... diese sollten i. d. R. aber kein Changed-Event auslösen oder?

Wie bereits erwähnt verwende ich das ASP.NET AJAX Control Toolkit und ich habe gerade festgestellt, dass es auf jeden Fall an den Controls liegt, ich erweitere meine DropDownLists mit dem ListSearchExtender (DropDownList suchbar machen) und wenn ich diesen entferne, so wird es nur einmalig abgeschickt...

Kennt sich jemand mit diesem Toolkit aus und hat evtl. eine Lösung? Ich vermute fast, das gehört hier nicht her... falls dies der Fall ist bitte einfach schließen.

Dies war für mich die Lösung: http://forums.asp.net/p/1311813/2592275.aspx

Vermute es ist ein Bug, das Toolkit befindet sich ja noch in der Entwicklungsphase.

03.05.2010 - 12:51 Uhr

Hi,

sorry, falls ich störend wirken sollte, aber ich habe ein seltsame Phänomen gefunden:

Wenn ich bei einer DropDownList die Auswahl verändere, so wird die Methode die bei dieser Änderung ausgeführt werden soll 2x ausgeführt. Setze in an die entsprechende stelle einen Breakpoint besitzt der gelbe Pfeil beim 2. mal eine seltsame Anmerkung:

Der Prozess oder Thread wurde seit dem letzten Schritt geändert.

Bezugnehmend auf meinen vorherigen Thread: Ich führe clientseitigen Javascript-Code bei onsubmit aus, unter anderem erscheint eine alert-/confirm-Box. Auch diese wird 2x angezeigt (der Rest würde mich noch nicht einmal stören, aber die selbe Abfrage 2x hintereinander ist schon extrem unschön.

Kurzum: Das Formular wird doppelt abgeschickt, hat jemand eine Erklärung für dieses Phänomen?

03.05.2010 - 10:40 Uhr

Du bist mein Held, ich danke dir vielmals! 👍 🙂 🙂

Wünsche eine schöne Woche!

03.05.2010 - 10:35 Uhr
    <script type="text/javascript">

        function MyFormValidation()
        {
            alert("false");
            return false;
        }
    
    </script>

    <form id="form1" onsubmit="MyFormValidation();" runat="server">

    [...]

Und auch DANN wird leider das Form abgeschickt. 🤔

Die erste Bedingung der if-Abfrage "!theForm.onsubmit" trifft aber ZU (weil ich false zurückgebe) und daher führt er den Code inkl. submit aus, das ist der Grund oder nicht?

03.05.2010 - 09:57 Uhr

Ach so und MEINE Methode führt dann __doPostBack aus, wenn die von mir gewünschten Bedingungen eintreten?

Wie kriege ich denn die erforderlichen Parameter? EventTarget und EventArgument?
Vermutlich über theForm.__EVENTTARGET.value und theForm.__EVENTARGUMENT.value?


<form id="form1" onsubmit="MyFormValidation();" runat="server">

MyFormValidation wird zwar aufgerufen, __doPostBack aber ebenfalls (anschließend), ohne das ich dies selber in MyFormValidation angegeben habe.

Warum? Vermutlich weil die Form-Elemente an sich beim onChange __doPostBack aurufen.

Habe es jetzt verstanden, was du von mir möchtest, denke ich, einen Moment...

Egal ob die MyFormValidation true oder false zurückgibt, der submit wird so oder so ausgeführt, was mache ich falsch?

03.05.2010 - 09:46 Uhr

Hierbei wird nichts ausgeführt:

function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        alert('foo');
    }
}

Erzeuge ich die Methode so

function __doPostBack(eventTarget, eventArgument) {
    alert('foo');

    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}

so wird der alert einmalig beim initialen laden der Seite angezeigt, allerdings wiederum nicht bei einem Change eines Objekts.