Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von tikra
Thema: Zugriff auf Freigabe in Domäne
Am im Forum: Netzwerktechnologien

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);

Thema: 3-Tier, verschiedene DBMS
Am im Forum: Rund um die Programmierung

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.

Thema: 3-Tier, verschiedene DBMS
Am im Forum: Rund um die Programmierung

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.

Thema: 3-Tier, verschiedene DBMS
Am im Forum: Rund um die Programmierung

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?

Thema: 3-Tier, verschiedene DBMS
Am im Forum: Rund um die Programmierung

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.

Thema: 3-Tier, verschiedene DBMS
Am im Forum: Rund um die Programmierung

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

Zitat von herbivore
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
        }
    }
}

Thema: Trotz Start als Admin wird gemeldet, dass noch Rechte fehlen
Am im Forum: Rund um die Programmierung

Wie finde ich das heraus?

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

Thema: Trotz Start als Admin wird gemeldet, dass noch Rechte fehlen
Am im Forum: Rund um die Programmierung

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);
            }
        }

Thema: String.Trim()-Methode (überschreiben und) erweitern
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Okay, sorry.

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

Thema: String.Trim()-Methode (überschreiben und) erweitern
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

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

Thema: String.Trim()-Methode (überschreiben und) erweitern
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

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.)

Thema: [Gelöst] JavaScript: Spaltenbreiten zweier Tabellen synchronisieren (Ansatz vorhanden)
Am im Forum: Web-Technologien

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?

Thema: [Gelöst] JavaScript: Spaltenbreiten zweier Tabellen synchronisieren (Ansatz vorhanden)
Am im Forum: Web-Technologien

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

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

Thema: [Gelöst] JavaScript: Spaltenbreiten zweier Tabellen synchronisieren (Ansatz vorhanden)
Am im Forum: Web-Technologien

Niemand eine Idee zu dieser Problematik?

Thema: [Gelöst] JavaScript: Spaltenbreiten zweier Tabellen synchronisieren (Ansatz vorhanden)
Am im Forum: Web-Technologien

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

Thema: [Gelöst] JavaScript: Spaltenbreiten zweier Tabellen synchronisieren (Ansatz vorhanden)
Am im Forum: Web-Technologien

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?

Thema: [Gelöst] JavaScript: Spaltenbreiten zweier Tabellen synchronisieren (Ansatz vorhanden)
Am im Forum: Web-Technologien

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!

Thema: [Gelöst] Div-Container (Menü) mit TreeView-Element -> Darstellungsfehler
Am im Forum: Web-Technologien

Zitat von MarsStein
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.

Thema: [Gelöst] dataTable.DefaultView.Sort mit "fester" Summenzeile?
Am im Forum: Datentechnologien

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.

Thema: [Gelöst] dataTable.DefaultView.Sort mit "fester" Summenzeile?
Am im Forum: Datentechnologien

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...

Thema: [Gelöst] dataTable.DefaultView.Sort mit "fester" Summenzeile?
Am im Forum: Datentechnologien

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.

Thema: [Gelöst] dataTable.DefaultView.Sort mit "fester" Summenzeile?
Am im Forum: Datentechnologien

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!

Thema: [Gelöst] Div-Container (Menü) mit TreeView-Element -> Darstellungsfehler
Am im Forum: Web-Technologien

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>

Thema: [Gelöst] Div-Container (Menü) mit TreeView-Element -> Darstellungsfehler
Am im Forum: Web-Technologien

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.

Thema: [Gelöst] Div-Container (Menü) mit TreeView-Element -> Darstellungsfehler
Am im Forum: Web-Technologien

Anhang: Nach der Expansion.

Thema: [Gelöst] Div-Container (Menü) mit TreeView-Element -> Darstellungsfehler
Am im Forum: Web-Technologien

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.

Thema: [Gelöst] TreeView im UpdatePanel als User Control verursacht Full PostBack
Am im Forum: Web-Technologien

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>

Thema: [Gelöst] TreeView im UpdatePanel als User Control verursacht Full PostBack
Am im Forum: Web-Technologien

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

Thema: Mehrere "kleine" UpdatePanels - Nachteile?
Am im Forum: Web-Technologien

Zitat von MarsStein
Hallo,
Zitat
Ä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.

Thema: Mehrere "kleine" UpdatePanels - Nachteile?
Am im Forum: Web-Technologien

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.