Laden...

Forenbeiträge von Birne Ingesamt 67 Beiträge

01.06.2012 - 12:17 Uhr

Hallo,

das Codebeispiel kannte ich schon.

Ich habe festgestellt das ohne das Sortieren der Elemente das gesamte Beispiel nicht funktioniert.

Dies war also die Lösung des Problems.

Vielen Dank ! =)

31.05.2012 - 15:30 Uhr

Hallo Community,

obgleich ich die Suche hier bemüht habe, konnte ich keine Lösung für mein Problem finden.

Das Problem ist Folgendes:
Ich versuche zu Prüfen ob an einem bestimmten Tag, in einem bestimmten Kalender ein Serientermin einer Terminserie existiert.

Das tue ich wie folgt:


            DateTime start = new DateTime(serienTermin.Start.Year, serienTermin.Start.Month, serienTermin.Start.Day, 0, 0, 0);
            string filter = "[Subject] = 'Test123' AND [Start] = '" + start.ToString("g") + "'";

            spezifischerKalender.Items.IncludeRecurrences = true;

            Outlook.AppointmentItem serienTerminFund = spezifischerKalender.Items.Find(filter);

"Normale Termine", also keine Serientermine, finde ich mit dieser Methode ohne Probleme.

Wie finde ich die Serientermine in meinem Kalender ?

Vielen Dank im Voraus !
Birne =)

17.08.2011 - 12:42 Uhr

Hallo Grumbler85,

Wenn du Serverseitig validieren willst/musst könntest du das ja auch am Ende machen und gleichzeitig alle validieren.

auch dies ist leider nicht möglich. Nach jeder abgeschlossenen Eingabe des Benutzers in eine Textbox wird der aktuelle Zustand gespeichert. Dies soll auch nach jeder Eingabe so sein, dafü entfällt der handelsübliche "Formular speichern" - Button.

Ich habe allerdings eine Möglichkeit gefunden die Buttons zu clicken 😄
Ein edit dieses Beitrags hier folgt im späteren Verlauf des Tages 😃

Trotzdem Danke für die Hilfe !

Birne

17.08.2011 - 10:47 Uhr

Hallo Grumbler85,

Dann benutze doch ein normales Postback im Button Click

das lässt sich leider nicht realisieren. Es handelt sich nicht nur um eine Textbox und somit wird nach jeder Benutzereingabe, die entsprechende Textbox validiert und weiterer serverseitiger Code ausgeführt.

17.08.2011 - 10:31 Uhr

Hallo Community,

ich habe ein Problem mit Asynchronen Postbacks aus den Updatepanels bzw. mit nachfolgenden Buttonclick Events.

Das Problem ist folgendes:
Nachdem der Benutzer eine Eingabe in einer Textbox (Autopostback = true) vorgenommen hat und einen Button anklickt, dann wird asynchron ein **Postback **ausgeführt, welcher dazu führt dass der jeweilige Button letztlich nicht geklickt wurde. Der Asynchrone Postback isst also den Button Click.

Nach füllen der Textbox wird diese Serverseitig validiert und es werden gewisse Berechnungen durchgeführt, diese möchte ich nicht mit Javascript durchführen.

Gibt es eine Möglichkeit diese Thematik in irgendeiner Weise zu lösen ?

Vielen Dank im voraus 😃
Birne 😃

29.06.2011 - 12:44 Uhr

Hallo Community,

ich versuche derweil aus einem** AD Informationen** zu einem User auszulesen (Email Adresse, Vorname und Co.)

Dazu bin ich bisher wie folgt vorgegangen:


            string filter = string.Format("(&(ObjectClass={0})(sAMAccountName={1}))", "person", "DerEntsprechendeUserName");
            string domain = "DieADDomain";

            System.DirectoryServices.DirectoryEntry adRoot = new System.DirectoryServices.DirectoryEntry("LDAP://" + domain, null, null, AuthenticationTypes.Secure);
            System.DirectoryServices.DirectorySearcher searcher = new System.DirectoryServices.DirectorySearcher(adRoot);
            searcher.SearchScope = SearchScope.Subtree;
            searcher.ReferralChasing = ReferralChasingOption.All;
            searcher.Filter = filter;

            SearchResult result = searcher.FindOne();
            System.DirectoryServices.DirectoryEntry directoryEntry = result.GetDirectoryEntry();

             string displayName = directoryEntry.Properties["displayName"][0].ToString();
             string firstName = directoryEntry.Properties["givenName"][0].ToString();
             string lastName = directoryEntry.Properties["sn"][0].ToString();
             string email = directoryEntry.Properties["mail"][0].ToString();

Beim auslesen der Properties bekomme ich allerdings stets die folgende Exception:> Fehlermeldung:

COMException: Unbekannter Fehler (0x8000500c)

Beim Debuggen ist mir auch aufgefallen das ich für den directoryEntry keine Schema Informationen abrufen, ebenfalls eine Exception vom Typ 'System.Runtime.InteropServices.COMException' geworfen bekomme.

Hat von euch jemand Rat wie ich erfolgreich zu meinem Ziel gelange und die spezifischen Informationen zu einem spefifischen User aus dem Active Directory auslesen kann ?

Vielen Dank schonmal

  • Birne -
02.05.2011 - 10:02 Uhr

Hallo felix,

vielen vielen Dank für deine hilfe.
Ich habe, wie du empfohlen hats, die jQuery ready Methode genutzt um zu determinieren ob das DOM aufgebaut ist.

Hintergrund war folgender.
Es existiert eine Sharepoint Website mit nur einem Webpart. Diese Seite, welche nur das Webpart und auch sonst keine Elemente wie Navigation oder ähnliches enthält (modifizierte Masterfile), wird als IFrame in eine andere Webseite eingebunden.

Das stellte mich vor das Problem von CrossiteScripting. ich konnte die Höhe des Contents des IFrames nicht ermitteln.

Um dieses Problem zu lösen, habe ich eine extra Seite der Domain in meinem Webpart geframed und diesem die Höhe meines Webparts (dynamischer Content) via URL zugeteilt. Dieses IFrame konnte dann wiederrum auf der anderen WebSite ausgelesen werden und somit konnte der IFrame via Javascript in der Höhe passgenau definiert werden.

Es handelt sich btw. bereits wie du schon erwähntest um ein Visual Webpart.

Das ursprüngliche Problem betrachte ich als gelöst.

Danke an Felix.

Lösung: jQuery Ready() Function
Die Höhe via OffsetTop vom letzten Element bestimmt.

29.04.2011 - 12:13 Uhr

Danke für die Info.

ich ahbe nun dochj die jQuery lib beugepackt, allerdings habe ich ein Problem bzgl des Caches.

Rufe ich meine Seite, in dem Rahmen also auch den WebPart, das erste mal auf, bekomme ich die Höhe von diesem (durch das Javascript) - Die Seite ist noch nicht im cache.

Nachdem die Seite im Cache ist, bekomme ich stets nur noch die Höhe des sichtbaren Bereichs im Broswer.

Weiss darüber jemand etwas ?
Danke

28.04.2011 - 23:03 Uhr

Vielen Dank !

Ich weiss es ist jetzt nicht mehr State Of the Art aber gibt es auch eine reine Ajax Solution, so dass ich die jQuery lib nicht beipacken muss ? :S

Im Notfall täte es aber auch die jQuery lib, ist nur unschön :S

28.04.2011 - 17:08 Uhr

Hallo Community,

ich habe ein problem mit meinem Sharepoint2010 Webpart, geschrieben in ASP.NET.

Ich möchte ein Javascript ausführen, welches ich zuvor im Webpart in dessen Init-Methode definiert habe.
Allerdings nachdem das Webpart komplett konstruiert ist, also Render durchlaufen hat.

Wie erreiche ich dieses Ziel ?
Vielen Dank für eure Hilfe.

21.03.2011 - 14:30 Uhr

Microsoft hat AJAX aus dem aktiven Portfolio genommen, da einfach jQuery deutlich flexibler ist. MVC (aktuell in Version 3) supportet jQuery auch aktiv, sowie Sharepoint.
Wenn Du an einer Neuentwicklung arbeitest ist der Umstieg auf MVC sicherlich eine lohnende Investition. AJAX und "Classic ASP" sind halt einfach in gewisser Hinsicht tot. Das neue Sharepoint basiert auch auf MVC.

Das Projekt lässt sich im aktuellen Status jetzt nicht mehr umschwenken auf MVC.
Ich habe jetzt ne quick&dirty solution gewählt und pushe das Datum als Value von der CodeBehind zurück.

Somit muss das jscript nicht mehr dynamisch erzeugt werden und es kann gecached werden.

21.03.2011 - 12:59 Uhr

AJAX Toolkit ist ein gestorbenes Produkt von Microsoft, das ansich mich Ajax nich viel am Hut hat.
Laut
>
kann man dem Calendar mit SelectedDate aber ein Datum vorgeben.

Dann ändert dies aber auch die Textbox and welche der Calendar attached ist.

Ich kann das Toolkit auch nicht neu compilen, weil mir der source code zu meienr hier eingesetzten version fehlt.

Die neue Version läuft auch mit sharepoint nicht mehr.

21.03.2011 - 11:31 Uhr

Hast du schon probiert generell das Caching abzudrehen? (Siehe z.B.
>
)

Habe ich probiert, funktioniert im IE leider nicht :I

Die andere Frage: Was tut dein Skript dass du es Server seitig generierst und nicht z.B. auf Page-Methods oder ähnliches setzt?

Das javascript gleicht ein defizit des Ajax Toolkit Controls "CalendarExtender" aus. Dieser lässt sich nicht mit einem Datum vorbelegen ohne dass die zugehörige Textbox den Inhalt auch ändert.

Ich hänge mich also in das "OnClienShowing" Event des Calendars und ändere das angezeigte Datum.

Das Datum ist Resultat Serverseitiger Berechnungen, weshalb ich das Script auch nicht in eine Datei auslagern kann.

21.03.2011 - 11:17 Uhr

Hallo Community,

ich habe ein Problem bzgl. Javascript Caching im Browser.

Das Szenario sieht wie folgt aus:

  • Ich füge im ServerCode meiner Seite via Page.ClientScript.RegisterClientScriptBlock ein dynamisch erzeugtes Javascript hinzu.

  • Leider wird das Javascript im Browser gecached und bisher habe ich keine Möglichkeit gefunden dass Javascript nicht cachen zu lassen oder es aus dem Browsercache zu** löschen**.

_
Welche Möglichkeiten gibt es, das Caching für dieses eine Script zu verhindern oder aber das Script aus dem Browsercache zu löschen ?

Ich hoffe ihr wisst Rat.
Vielen Dank !

Birne

14.12.2010 - 15:45 Uhr

Hallo Community,

ich bins noch einmal:

Nachdem ich also die Row dynamisch im Event hinzugefügt habe, gibt es ein weiteres Problem.
Mit dem Button ist stets die Umschliessende Row verknüpft, diese benötige ich, um unterer anderem den aktuellen Index zu ermitteln.

Wenn ich auf den Button der neuerstellten Row klicke, ist nicht der Button der neuerstellten Row der Sender, sondern stets der letzte in der Auflistung BEVOR, das Buttonevent ausgeführt wurde.

Gibts eine Möglichkeit das zu eleminieren oder ist das, das Resultat aus dem dem Lifecycle ?

14.12.2010 - 15:01 Uhr

Super !

Läuft einwandfrei.
Der Fehler in diesem Fall:
Das Buttonpropertie, sowie der Rowaufbau als Solcher.
Ich habe den Cellcontent nun direkt über den Cellindex hinzugefügt und die Buttons einfach Public definiert.

Vielen Dank euch beiden und vorallem Marsstein für eure Mühen !
Birne

14.12.2010 - 13:45 Uhr

Hallo,

Den habe ich wieder rausgenommen, weil er keinen effekt hat.
Bist Du sicher?

Ja

Wenn ich auf einen Button clicke, wird zunächst der PostBack verursacht, also geht die Clickeventanmeldung ohnehin verloren.
Das ist zwar richtig. Aber wenn der PostBack stattfindet, wird ja genau der Handler ausgeführt, der beim vorherigen Request registriert wurde! Deshalb ist es IMHO nötig, den Handler direkt zu registrieren.

Probiere das mal mit Hilfe des Debuggers aus. Dem ist nicht so, hat mich auch erstaunt.
Und wenn das so wäre, dann würde ich die dämlichen Rows auch nicht im INIT erzeugen sondenr im Prerender reinwerfen, nur aus Gründen der Eventanmeldung mache ich das.
Es erzählen zwar immer alle, man soll neue Objekte im INIT erzeugen aber den Sinn sehe ich darin nicht, weil in der MSDN steht, das gewisse Änderungen im PreRender durchgeführt werden.
Und so kennt man es auch von Ajax, selber Cicle.
Stage 4 die Seite ist da, alle sichtbaren Änderungen welcher der Entwickler noch wünscht, werden dort getätigt.

Außerdem hast Du offenbar nicht bedacht, daß sich durch die Inserts die Indizes aller nachfolgenden Zeilen verschieben - und die sind noch als Member gespeichert.
Das macht höchstwahrscheinlich auch Probleme.

Argh !!!
Gut, dass du das erwähnst ! Das werde ich gleichmal beheben, ändert aber nichts an den ButtonEvents und den "+" Zeichen 😦

Zusätzlich empehle ich grundsätzlich, eigene IDs für alle Controls zu vergeben.

Im INIT ?

Edit:
Bitte erstmal nicht weiterrätseln, ich bin auf heisser Spur jetzt !
Ich gebe weiteres hier bekannt.

Edit2:
Hat sich wieder erledigt.
Ich könnte noch vermuten er schiebt mir den "+" Text des ersten Buttons, welcher IMMER erzeugt wird auf die vorherige Textbox Cell, macht aber wenig Sinn.

Edit3:
Index Problem behoben.

14.12.2010 - 13:31 Uhr

Hallo,

jetzt gibt's plötzlich noch eine Klasse newRow - warum? Du verkomplizierst die Sache dadurch ja nur.

Sorry Tipfeghler von mir.
Ist korrigiert.

            {  
                abgeleiteteRow tRow = new abgeleiteteRow(recievedRow.IsRepeatable, true, recievedRow.ZAObjectTypeId, recievedRow.Name);  
  
                this.rowList.Insert(recievedRow.Index + 1, tRow);  
                tblObjects.Rows.AddAt(recievedRow.Index + 1, tRow);  
// hier hat die neu erzeugte Row noch keinen Click-Handler!!  
  
            }  
  

Den habe ich wieder rausgenommen, weil er keinen effekt hat.
Wenn ich auf einen Button clicke, wird zunächst der PostBack verursacht, also geht die Clickeventanmeldung ohnehin verloren.

Das erklärt zumindest, warum bei Click eines Buttons in einer neuen Zeile das Event nicht ausgelöst wird, aber nicht für die vorhandenen 😦

Leider tut es das nicht :S

Warum arbeitest Du mit dieser Ableitung von TableRow, was passiert denn da drin sonst noch? Könnte es an der Implementierung dieser Klasse liegen?

Gruß, MarsStein

Die TableRow enthält Felder für zwei Buttons, 5 typisierte Textboxen und ein Label.
Desweiteren Properties für ein paar IDs und Boolsche Variablen.


OK,

das sehe ich allerdings problematisch, wenn du es wirklich so machst:

EVENTHANDLER

  • Neue Row erstellen
    - Eventhandler anmelden
  • Row der internen Liste hinzufügen
  • Row der Table hinzufügen

das solltest du NICHT im Eventhandler machen, dies kann auch zu nebeneffekten führen.

mfg
serial

Ich habe es probiert, und es hat keinen Effekt weil eben erst der Postback kommt.
Die Eventhandler müssen alle im INIT neu erzeugt werden damit sie funktionieren.

OT aus Interesse:
Welche Probeleme können denn dabei auftreten wenn ich es so machen würde und es täte funktionieren ?
Bei Windows Forms lief das auch immer Prima.

14.12.2010 - 13:21 Uhr

Hallo,
also so wie ich das sehe, speicherst du die Rows immernoch in der Session, besser ist es diese jedesmal im Init neu zu erzeugen, wie MarsStein schon gesagt hat.

Ich erzeuge die jedesmal neu, in der Session liegen Rows ja, allerdings nutze ich nur die Informationen dieser Rows.

  
 // Neue Row erstellen  
                abgeleiteteRow newRow = new newRow(row.IsRepeatable, row.IsRepeated, row.ZAObjectTypeId, row.Name);  
  

Jede Row in der Table ist eine neu Erzeugte.

Ich würde dir dennoch empfehlen mit einem GridView zu arbeiten, und deine Aktionen mit Commands in diesem zu behandeln.

Wie schon erwähnt, werde ich dies auch tun, allerdings möchte ich dieses Problem gerne lösen, unabhängig davon, ob das es eine elegantere Lösung gibt.

14.12.2010 - 12:57 Uhr

OK Danke.

Hier also etwas Code:

Members


        /// <summary>
        /// Enthält zur Erstellung der Tabellenspalte benötige Informationen
        /// </summary>
        public List<abgeleiteteRow> rowList;

S1 - Init
Einmalig- und erstmaliges Füllen der internen Liste


            #region - On Start -
            if (!IsPostBack)
            {
                foreach (TypeDataSet.TypeRow row in TypeDataSet.TableName)
                {
                    abgeleiteteRow tRow = new abgeleiteteRow(row.REPEATABLE, false, row.ID, row.NAME);
                    rowList.Add(tRow);
                    tRow.Index = rowList.IndexOf(tRow);
                }
                Session["rowList"] = rowList;
            }
            #endregion - On Start -

Tabelle befüllen


            foreach (abgeleiteteRow row in rowList)
            {
                // Neue Row erstellen
                abgeleiteteRow = new newRow(row.IsRepeatable, row.IsRepeated, row.ZAObjectTypeId, row.Name);
                newRow.DateFrom = row.DateFrom;
                newRow.DateTo = row.DateTo;
                newRow.Days = row.Days;
                newRow.Hours = row.Hours;
                newRow.Remark = row.Remark;
                newRow.Index = row.Index;

                tblObjects.Rows.AddAt(newRow.Index, newRow);

                // Events anmelden, row refenrezne übergeben
                foreach (abgeleiteteRowButton btn in newRow.Buttons)
                {
                    btn.AbgeleiteteRow = newRow;
                    btn.Click +=new EventHandler(btn_Click);
                }
            }

S3 - Eventhandling


        void btn_Click(object sender, EventArgs e)
        {
            abgeleiteteRowButton btn = sender as abgeleiteteRowButton;
            abgeleiteteRow recievedRow = btn.AbgeleiteteRow;

            // Löschen oder neu anfügen
            if (btn.AddOrRemove)
            {
                abgeleiteteRow tRow = new abgeleiteteRow(recievedRow.IsRepeatable, true, recievedRow.ZAObjectTypeId, recievedRow.Name);

                this.rowList.Insert(recievedRow.Index + 1, tRow);
                tblObjects.Rows.AddAt(recievedRow.Index + 1, tRow);

            }
            else
            {
                this.rowList.RemoveAt(recievedRow.Index);
                tblObjects.Rows.RemoveAt(recievedRow.Index);
            }
            Session["rowList"] = rowList;
        }

Vielen Dank
Birne

14.12.2010 - 10:55 Uhr

Hallo Marsstein und vielen Dank für deine bisherige Hilfe.

Bevor ich mich an den Alkternativvorschlag heranwage, habe ich variante 1 noch einmal ausprobieret.

Erzeugen der Rows, durch auslesen der internen Liste
Versuchst Du immer noch, die Rows über diese Liste zu persistieren?
Du solltest die Controls jedenfalls nicht in der Liste halten, eher die benötigten Daten zum Erzeugen der Controls. Die Controls sollten im Init immer wieder mit new erzeugt werden.
Du kannnst dann die einzelnen Zeilen im EventHandler erstellen und hinzufügen, sorge nur dafür daß sie beim nächsten Aufruf im Init miterstellt werden.

Ok, ich lese jetzt meine Interne Liste aus, erstelle aber neue Rows mit den Properties der Rows aus der internen Liste.

Doch nach wie vor treten mir unerklärliche Effekte auf 😦

Die Events reagieren nur bei jedem zweitem Click, auf jeden ersten Click fügt sich ein "+" an irgendeine Zelle ein und ein die bisherigen Rowzellen scheinen wild durcheinander zu fliegen.

Aktuelle Implementation sieht wie folgt aus:

INIT

  • Einmaliges füllen der internen Liste (!IsPostback).
  • Auslesen der internen Liste aber mit new neue Rows erzeugen und der Tabelle hinzufügen
  • Events anmelden
  • Button referenzen aus sicherheitsgründen übergeben

EVENTHANDLER

  • Neue Row erstellen
  • Eventhandler anmelden
  • Row der internen Liste hinzufügen
  • Row der Table hinzufügen

Erster Click:

  • Postback
  • Click Eventhandler wird aufgerufen
  • Zeile wird hinzugefügt an richtiger Stelle

= Alles Schön

Versuch weitere Row anzulegen mit Click auf irgendeinen der Buttons zum adden einer neuen Row:

  • Postback
  • Clickeventhandler wird NICHT AUFGERUFEN
  • '+' erscheint irgendwo in eienr Zelle
  • Zellen durcheinandergewürfelt

Erneuter Click

  • Postback
  • Click Eventhandler wird aufgerufen
  • Zeile wird hinzugefügt an richtiger Stelle

usw. usf.
Auch wenn der Alternativvorschlag besteht und ich diesen wohl eher in Betracht ziehen werde, will ich wissen, warum das Ganze bei der bisherigen Variante so fatal verbuggt.

Alternativvorschlag:
Das wäre so die "normale" Lösung. Die verlinkte Doku-Seite ist sehr umfangreich, aber auch sehr hilfreich. Wenn Du diesen Weg einschlagen willst, empfehle ich, sie zuerst komplett zu lesen.

Werde ich mich definitiv mit befassen
aber dennoch will ich obiges Problem lösen.

EDIT:

Als Anmerkung vielleicht noch.
Es handelt sich bei mir NICHT um eine Seite, sondern um ein Seperates Usercontrol, der Viewstate ist für dieses Usercontrol aber abgeschalten.
Vielen Dank
Birne

13.12.2010 - 15:46 Uhr

Hallo Marsstein,

ich habe jetzt deinen rat befolgt, mich mit dem Lifecycle befasst und auch die Rows alle im init erzeugt.
Ich komem trotzdem nicht witer.

Ich habe bereits eine Exkursion in Javascript unternommen - mit mäßigem Erfolg.

Derzeit gehe ich Folgt vor im LifeCycle meines Controls

Init

  • Erzeugen der Rows, durch auslesen der internen Liste

Load

  • Anmelden der Events

Prerender

  • Temporäres anfügen der Row an die Table (geht beim nächsten Postback natürlich verloren)

Problematischerweise sitzt das Eventhandling ja zwischen dem Load und dem PreRender ...
Wenn ich also in meinem Click Event handler eine neue Row meiner Liste hinzufüge, gibt es keine funktionierende Möglichkeit diese auch anzuzeigen.

Ich kann die Rows auch nicht erst im Prerender erzeugen, weil die Eventhandler erst nach einem Button Click und dem damit verbundenen Postback angemeldet werden müssen.

Ich muss meine Rows und Events also im Init erzeugen, anonsten wird der Eventhandler beim Clicken garnicht erst aufgerufen.

Bisher bin ich mit allen meinen Versuchen das Problem in den Griff zu bekommen gescheitert.
Als da wären:

  • Postback verursache im ButtonClick event. Gibt im günstigstens Fall nen JScript Error an dieser Stelle.

  • Buttons mit OnClientClick Event mit Javascript für Postback versehen. Called die Loadmethode gleich zweimal ...

  • Die Row welche der internen Liste hinzugefügt wurde im Preload Event der Table zuweisen:
    Funktioniert bis ich die nächste Row hinzufüge. Dann treten seltsame Effekte auf, bei welchen in Vermute es liegt an der Identifikation der Rows. ASP.NET und meine inetrne Liste vertragen sich also nicht :0

Wie löse ich nun das Problem ? 😦

Ich habe mich das ganez WE tot gegoogelt. so ziemlich Alles ausprobiert, nichts hilft :S

Ich bitte um Rat.

08.12.2010 - 13:36 Uhr

Vielen Dank für die Ausführliche und Hilfreiche Antwort und den Link.

Die Tabellenrows lassen sich jetzt wunderbar löschen, auch mit den Werten in der Tabelle wird kein Lotto mehr gespielt 👍

_
Bleibt nur noch Problem 1 über,

die Events reagieren jeweils nur beim zweiten Klick.
Nach jedem ersten Click, verschwinden ALLE zuvor gemachten Eingaben. Beim Click 2 läufts dann.

Da stimm etwas mit dem Lifecycle nicht, nur was ? 🙁

Vielen Dank bisher !

08.12.2010 - 11:02 Uhr

Hallo Community,

ich stehe derzeit vor einem Problem im Rahmen eines ASP.NET 3.5 Controls.
Ich hoffe ihr könnt mir abermals helfen.

_
Problembeschreibung:

Ich füge zur Laufzeit einer Tabelle neue Zeilen hinzu.
Die Rows leiten von der Klasse TableRows ab und** implementieren **neben Textboxen udn Inputfeldern auch Buttons.

Die Rows werden der Table nicht direkt hinzugefügt, sie werden zunächst in eine** interne Liste geworfen.
Diese Liste speicher ich
im Sessionobjekt**, um die Rows nach einem POST Back nicht zu verlieren.

Die Rows besitzen eine Propertie welche eine List aller Buttons in den Rows zurückgibt.

Ich habe eine Extra Methode geschrieben welche mir die** inetrne Liste ausliest** und die Rows eben dieser dann zur Tabelle hinzufügt, sowie Button Events registriert, da ja auch diese durch den POST Back verloren gehen.

Es treten im konkreten Fall** zwei Probeleme** auf:

  • Die Buttons reagiseren nur bei jedem zweiten Klick :I

  • Beim Löschen von Rows aus der Liste und der Table, kommt die Table völlig durcheinander und verteilt die Werte der Rows random und die entsprechenden Row wird erst nach mehrmaligem Löschen wird gelöscht, sie rutscht zunächst im Index immer weiter nach oben. Row Nr. 87 müsste 87 mal gelöscht werden, bis sie denn auch wirklich nicht mehr in der Tabelle erscheint.

Beispiel Code:


protected void Page_Load(object sender, EventArgs e)
        {
            // Liest das Sessionobjekt aus
            if (Session["rowList"] == null)
            {
                rowList = new List<AbgeleiteteRow>();
            }
            else
            {
                rowList = (List<AbgeleiteteRow>)Session["rowList"];
            }

            // Fügt der Table die neuen Rows hinzu und melden alle Events der Buttons an
            ShowTable();
        }


        protected void ShowTable()
        {
            foreach (AbgeleiteteRow row in rowList)
            {
                foreach (AbgeleiteteRowButton btn in row.Buttons)
                {
                    // Eventhandler anmelden
                    btn.Click += new EventHandler(Click_EventHandler);
                }
                // Rows der Table hinzufügen
               TheTable.Rows.Add(row);
            }
        }

Der Klick Event Handler


        void Click_Eventhandler(object sender, EventArgs e)
        {
            AbgeleiteteRowButton btn = sender as AbgeleiteteRowButton;
            
            // jeder Button enthält eine referenz auf seine Row
            AbgeleiteteRow RowOfButton = btn.AbgeleiteteRow;

            // Löschen oder neu anfügen
            if (btn.AddOrRemove) // Hinzufügen
            {
                // Wir fügen eien neue AbgeleiteteRow hinzu
                AbgeleiteteRow newAbgeleiteteRow = newAbgeleiteteRow(RowOfButton.IsRepeatable, true, RowOfButton.ZAObjectTypeId, RowOfButton.Name);

                // Die Row wird direkt unter dem Vorgängereingefügt
                rowList.Insert(rowList.IndexOf(recievedRow) + 1, newAbgeleiteteRow);
            }
            else // Löschen
            {
               
                // Die Row aus der internene Liste an der richtigen Stelle löschen
                rowList.RemoveAt(rowList.IndexOf(RowOfButton));

                // Die Row aus der Table löschen
                TheTable.Rows.Remove(RowOfButton);
                
            }
            // Die RowListe in das Sessionobjekt werfen
            Session["rowList"] = rowList;

            // DIe Tabelle anzeigen
            ShowTable();
        }

Ich sitze an dieser Stelle fest, weiss nicht, warum die Evenets nur jedme zeitwen Click funktionieren, oder die Rows nicht korrekt gelöscht werden.

Ich hoffe ihr könnt mir helfen
Vielen Dank schonmal !

Birne

17.11.2010 - 12:20 Uhr

Mir scheint, du hast die Funktionsweise des Winform-BindingNavigators falsch verstanden.

Ist in meinem Fall von Irrelevanz an was der BindignNavigator in Winform gebunden wurde. Ob nun an eine BindingSource oder eine DataSource.

Mir geht es darum den BindingNavigator in WPF in einem eigenen Control nachzubilden.
Wichtig in meinem Fall ist, was der Nutzer sieht/kann.
Er soll in meinem Fall durch die Datensätze im DataGrid navigieren können.


Ich stimme dir aber zu, der BindingNavigator macht zu Weilen wenig Sinn, soll aber nicht Thema dieses Threads sein.

17.11.2010 - 10:20 Uhr

Hallo Community,

der Titel mag etwas irreführend wirken, deshalb beschreibe ich das Problem im folgenden heir etwas genauer, praxisbezogener.

Wie bekannt, gibt es unter der WPF kein BindingNavigator Tool mehr,
also habe ich versucht, mir ein eigenes UserControl, welches die Funktionalitäten eines BindignNavigators in Bezug auf ein attached DataGrid bereitstellt, zu schreiben.

Dabei habe ich folgendes Versucht.

Ich übergebe via Propertie ein DataGrid an mein BindingNavigator Control.

Die UI des Bindingnavigators ist an dieses Propertie gebunden. In meinem Fall habe ich nun begonnen die ANzahl der Items auszulesen.

Das funktioniert auch prinzipiell, doch Wenn sich die Anzahl der Items im orginalen DataGrid ändern, so reagiert die GUI auf diese Änderung nicht.

Dabei handelt es sich doch nur um eine Referenz die ich übergebe ?
Warum bekommt die BindingNavigator Klasse die Änderung nicht mit ?

Hier die Sourcen.

Die BindingNavigator Klasse, des UserControls.


/// <summary>
    /// Interaction logic for BindingNavigator.xaml
    /// </summary>
    public partial class BindingNavigator : UserControl, INotifyPropertyChanged
    {
        /// <summary>
        /// reference to the dataGrid to work on
        /// </summary>
        private DataGrid dataGrid;

        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Constructor
        /// </summary>
        public BindingNavigator()
        {
            InitializeComponent();
        }

        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }

        public DataGrid DataGrid
        {
            set 
            {
                this.dataGrid = value;
                OnPropertyChanged("DataGrid");
            }

            get 
            {
                return this.dataGrid;
            }
        }
    }

Die dazugehörige XAML (nicht komplett, jeweils auf meines erachtens wichtige beschränkt)


<UserControl x:Class="UserControls.BindingNavigator"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" Width="300" Height="50">
    <Grid x:Name="rootGrid">
            <Label x:Name="lblItemsCount" Content="{Binding Path=DataGrid.Items.Count, Mode=OneWay}"></Label>
    </Grid>
</UserControl>

In einer ganz normalen WPF Anwedung platziere ich also meinen BindingNavigator und setzte die DataGrid propertie:


        private void dataGrid1_Loaded(object sender, RoutedEventArgs e)
        {
            DataGrid dg = sender as DataGrid;
            dg.Items.Add("entry");
            dg.Items.Add("entry");

            this.bindingNavigator1.DataGrid = dg;
        }

        /// <summary>
        /// add addional entrys to test if the binding navigator update the item counter
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            this.dataGrid1.Items.Add("entry");
            this.dataGrid1.Items.Add("entry");
        }

Könnt ihr mir helfen ?
Vielen dank schon einmal 😃

Birne

19.03.2010 - 11:41 Uhr

Die Exception lautet wie exakt? Warten bis die Exception auftritt und nach der InnerException Ausschau halten und schauen ob dort eine Bemerkung ist.

Entschuldige bitte die extrem verspätete Antwort, ich hatte einen lägeren Krankenhausbesuch zu verzeichnen ...

Die Inner Exception ist folgende:
_COMPlusExceptionCode = -532462766

Google bereits befragt, mit mäßigem Erfolg :\

Danke bis hierher
Birne

02.03.2010 - 12:46 Uhr

Danke für de Link, doch kannte ich dieses Tutorial schon 🙂

Derweil habe ich exakt den Code des Tuts kopiert, bekomme aber dennoch eine Exception. Fehlercode 202.

Ich habe bereits im Server Manager nachgesehen (MS SQL Server 2008 ) ob evtl. Berechtigungen fehlen, aber ich verbinde mich mit dem SA im Connectionstring der App.

Daten aus der DB heranschaufeln und Entitäten dynamisch nachladen funktioniert ohne Probleme.

Der SQL-Profiler(AnjLab SQL Profiler) hilft mir dabei nicht weiter, zumindest weiß ich nicht, welche Informationen von Bedeutung sind für mich :\

Edit:
Auch die Access-Rules im WebDataService sind entsprechend gesetzt.
In diesem Schema:


config.SetEntitySetAccessRule("TaskType", EntitySetRights.All);

02.03.2010 - 10:00 Uhr

Hallo allerseits,

ich habe mich diese Woche mit dem Entity Framework vertraut gemacht und eine Simple SilverlightApp geschrieben.

Dabei liest diese App Benutzer aus einer Datenbanktabelle aus und soll auch in der Lage sein, dort neue Benutzer hinzuzufügen.

Ich habe zwar schon häufig gegoogelt, aber nicht ein wirklich umfassendes Tutorial gefunden so dass ich nun immer noch vor dem Problem des Updates der Datenbank stehe.

Folgende Situation beim Anlegen eines neuen Users:


private void UserAnlegen(User usr)
{
       dataContext.AddToUser(usr);
       dataContext.BeginSaveChanges(SaveChangesOptions.Batch, SaveChanges, usr);
}

private void SaveChanges(IAsyncResult result)
{
        svcContext.EndSaveChanges(result);
}

Ich bekomme nach Ausführung eine DataServiceReferenceException.
Laut Debugger Fehlercode 500, also Internal Server Error.

Ich hoffe es kann mir jemand von euch unter die Arme greifen, wie ich die DB erfolgreich updaten kann :\

Und ja, ich habe google und die MSDN schon ausgiebig bemüht X(

Danke schonmal 🙂

24.11.2009 - 15:14 Uhr

Hallo,

Und diesen Offset kannst du nicht irgendwie ermitteln und entsprechend korrigieren ?

Änderst du vllt. den Inhalt so das der Offset nicht mehr stimmt ?

Andernfalls ist mir auch keinr saubere Lösung bekannt :\

23.11.2009 - 15:53 Uhr

Ich schliesse mich dem Fragesteller an, mich interessiert auch warum der Scrollzustand bei einer Focusänderung nicht erhalten bleibt.

Ein Workaround wäre natürlich einfach klassisch die Scrollzustände zu speichern, sich ans Focus-Event zu hängen und die Scrollvalues explizit wieder auf ihre Ursprungswerte zu setzen.

Edit: In etwa so:

        
private void Panel_Leave(object sender, System.EventArgs e)
        {
            _horizontalScrollValue = HorizontalScroll.Value;
            _verticalScrollValue = VerticalScroll.Value;
        }

        private void Panel_Enter(object sender, System.EventArgs e)
        {
            HorizontalScroll.Value = _horizontalScrollValue;
            VerticalScroll.Value = _verticalScrollValue;
        }

Funktioniert bei mir, befriedigt mich aber nicht ...

20.11.2009 - 14:48 Uhr

Hallo,

vom Grundkonzept würde ich es so anstellen.

  • Global definierten Zoomfaktor festlegen.

  • Bild Laden, ursprungsausmaße speichern.

  • Für die Pfade ne eigene Klasse erstellen(Nenne ich hier PfadObjekte).

  • Dort aus den GPS Daten nen Pfad erstellen.

  • PfadObjekte in Globale Liste packen

  • OnPaint überschreiben,

  • zuerst das Bild um den Zoomfaktor gestreckt zeichnen,

  • Liste mit den PfadObjekten auslesen, dann die jeweiligen Pfade gestreckt mit einer Matrix um den Zoomfaktor zeichnen lassen.

Als kleiner Tip, implementiere Double Buffer lieber gleich selbst, gibt sonst nen bößes Erwachen in hohen Zoomstufen.
Sone Standard gebufferte Bitmap kann dann schonmal 800 MB Groß werden ->Result: Out Of Memory Exception
Also nur das Buffern was auch zu sehen ist.

  • MouseMoveEvents abfangen und stets Prüfen ob einer der GraphicPath's von den PfadObjekten aus der Liste unter der aktuellen MousePosition sichtbar ist.

Der Rest ist ne Implementationssache, je nachdem wie die Bedienung des Programms ausfallen soll.

Wichtig: Komm gar nicht erst auf die Idee für diese PfadObjekte eigene Controls zu verwenden, sone Slideshow hast du noch nicht gesehen.
Ich spreche da aus Erfahrung.
Ich musste nehmlich erst kürzlich eine ganz ähnliche Problemstellung wie du sie hier beschreibst lösen.

Edit:
Double Buffer selbst implementiert:
http://www.bobpowell.net/doublebuffer.htm

18.11.2009 - 14:07 Uhr

Danke, so werde ich vorgehen.

18.11.2009 - 12:59 Uhr

Nun ja warum ist dies so.
Die Picturebox enthält in meinem Fall eine Karte, auf dieser können markierungen und andere Geometrische Figuren hinzugefügt werden.
Ebenso gibt es die Möglichkeit herein und heraus zu zoomen, die Markiereungen mit der Maus zu verschieben usw usf. Ähnlich wie google Maps.

Das Panel(Container) dient nur dazu die Karte zu scrollen.
Das heisst wird in die Picturebox gezoomt wird auch das Control selbst, also die Picturebox entsprechend größer. Ich wollte keine eigenen Scrollbars implementieren also habe ich das ganze Control(PictureBox) in ein Panel(mein Container) gepackt, und dort aus verschiedenen Gründen die OnMouseWheel Methode überschrieben -> Deshalb eben das User Control.

Ich hoffe es ist halbwegs verständlich :\

18.11.2009 - 10:22 Uhr

dein Form kennt doch alle seine Controls, egal ob diese nun direkt oder indirekt im Form enthalten sind (eine Ausnahme sind die Controls, die in einer eigenen Klasse z.B. einem UserControl gekapselt sind, aber das trifft ja hier nicht zu).

Naja doch ^^
Der Container ist von Panel abgeleitet und die Picturebox ist eben auch ein UserControl abgeleitet von PictureBox.

Ich habs nicht mit angegeben, weil ich dem bei der Lösung des Problems keine Bedeutung zugestanden habe >_>

Entschuldigt bitte :\

18.11.2009 - 09:32 Uhr

Hmm letzlich nur wegen der Steuerstruktur.

Ich habs nun so gelöst wie ihr es mir geraten habt, nur befriedigt mich das auf keinster Weise.

Panel mit Buttons ruft Methode auf Panel(Conatiner) auf, dieses wiederrum die entsprechende Methode auf der Picturebox.

Beispiel LoadImage:

Button, ClickEvent -> Panel(Conatiner), LoadImage -> ImageBox, LoadImage.

Natürlich äußerst funktional aber unhübsch wie ich finde.

17.11.2009 - 17:22 Uhr

Als ich ihn fragte ob er öfters mit Freunden einen trinken geht, sagte er wieder sowas sei Zeitverschwendung.

Ich muss ihm da recht geben.

Die Zeit und Geldverschwendung muss jeder mit sich selbst aus machen aber damit ist auch immer eine riesen Potentialverschwendung verbunden.
Ich bin zwar selbst erst 19 Jahre alt aber trotzdem der Meinung das sich die Entwicklung des Mediums Computer eher Negativ als Positiv auf die Jugend auswirkt.

Sicherlich, mit dem Computer sind viele Dinge einfach und schnell zu realisieren. Leider sehe ich 90% meines Bekannten Kreises am PC nur Zocken.

Letzlich kann sich ja jeder selbst mal die Frage stellen was er mit dem PC wirklich produktives Anstellt, oder obs nicht doch einfach ne luxoriöse Spielekonsole ist 😉

Ich schliesse mich da selbst nicht aus, auch ich zocke , mittlerweile eher seltener, noch am PC oder gehe ab und wann, mal in die Kneipe bei nem Schnäpper ne Runde Billard spielen.

17.11.2009 - 16:43 Uhr

Ich könnte in der Tat ein weiteres Transparentes Panel hinzufügen, so dass die Struktur wie folgt ausschaut:

[FORM]
[PANEL]
[BUTTON]
[BUTTON]
[BUTTON]
[/PANEL]
[PANEL]
[PICTUREBOX]
[/PANEL]
[/FORM]

Nur weiss ich aus Erfahrung, das TransparenteControls, GDI und Performance sich überhaupt nicht vertragen :S

Wäre alles so trivial, hätte ich in diesem Fall nicht nachgefragt.

17.11.2009 - 16:30 Uhr

Genau diese Struktur möchte ich vermeiden :\

Darum meine Frage, ob es eine Möglichkeit gibt die Buttons fix zu positionieren.
Eine Möglichkeit wäre es, sich an die Scrollevents dranzuhängen und abhängig von der aktuellen Scrollposition die Buttons in ihrer Position auf dem Panel zu ändern.

Ich schätze diese Variante jedoch selbst als suboptimal ein, denn ich glaube kaum, dass dies Performant umzusetzen ist.

17.11.2009 - 16:06 Uhr

Hallo,

Die Buttons liegen nicht auf der Picturebox.
Sie liegen genau wie die PictureBox auch, auf einem Panel.

[PANEL]
[BUTTON]
[BUTTON]
[BUTTON]
[PICTUREBOX]
[/PANEL]

Wird die PictureBox zu groß, so erscheinen die Scrollbalken und wie erwartet kann gescrollt werden.
Jedoch sollen die Buttons ihre Position in Bezug auf die Formkoordinaten nicht ändern.
Die Position auf dem Panel ist ja nach wie vor die Selbe, ob gescroltl wird oder nicht.

Resultat, die 3 Buttons verschwinden beim scrollen mit Teilen der Picturebox ggf. in den nicht sichtbaren und somit nicht nutzbaren Bereich.

Schwer zu erklären, aber die Buttons sollen ähnlich wie fliegendes Menü einer Website sein, diese Menüs befinen sich stets auf der selben position in bezug auf das Browserfenster, egal wo sich der SeitenContent durch das scrollen gerade befindet.

Danke schonmal für Antworten bisher.

17.11.2009 - 13:52 Uhr

Hallo Community,

ich Suche eine Lösung für das folgende Problem.

Auf einem Panel habe ich 4 Formelemente: 3 Buttons, eine Picturebox.
Die AutoScroll Eigenschaft des Panels ist auf true gesetzt.
Wird die Picturebox größer als das Panel, erscheinen wie erwartet die Scrollbars.
Betätige ich diese so scrollen aber nicht nur die Picturbox, sondern auch die 3 Buttons mit.

Wie realisiere ich "fliegende/fixe" Buttons welche sich stets auf ein und derselben Position relativ zum Bildschrim oder der gesamten Form befinden ?

Ich bin für jeden Lösungsansatz/Workaround dankbar 😃

Birne

16.11.2009 - 15:40 Uhr

Die PictureBox bringt standardmäßig voreingestellten DoubleBuffer mit.
Für das Panel musst du DoubleBuffering erst aktivieren 😃
Flackerfrei ist also ohne Probleme auch mit dem Panel möglich.

16.11.2009 - 15:34 Uhr

Gezeichnet wird grundsätzlich im OnPaint Event und NIEMALS ausserhalb.
Mit deiner aktuellen Implementation müsstest du dir nen eigenen DoubleBuffer schreiben. Zeichnest du ausschliesslich im OnPaint Event, funtkionieren auch deine DoubleBuffer wie gewünscht.

siehe auch: [FAQ] Flackernde Controls vermeiden / Schnelles, flackerfreies Zeichnen

Das hier:

        private void OnPerformPaint(Boolean dawn)
        {
            if (this.mControlRef != null)
            {
                if (!this.mDawn)
                {
                    if (this.mDarkenModeActive)
                    {
                        if (this.mFirstDraw)
                        {
                            this.mDarkenTimer.Enabled = true;
                            this.mFirstDraw = false;
                        }
                    }
                    else
                    {
                        this.mCurrentOpacity = mMaxOpacity;
                    }

                    if (this.mGraphics == null)
                    {
                        this.mGraphics = this.mControlRef.CreateGraphics();
                    }
                   
                    this.mGraphics.FillRectangle(new SolidBrush(Color.FromArgb(this.mCurrentOpacity, 0, 0, 0)),    this.mControlRef.ClientRectangle);
                   }
             }
        }

gehört also ins Paint Event

11.11.2009 - 15:30 Uhr

Ahhh, warum sagt ihr mir das nicht gleich.
Der Link ist also unfunktional.

In diesem Fall: Link kopieren, ins Suchfeld von Google einfügen, zumeist ersten Link anklicken, Lösung lesen.
BTW. ist das seitens EE so gewollt 🤔

11.11.2009 - 15:16 Uhr

philoware:

//*** Assume that your parent window is parentForm  
//***When you are creating each form, add it to parentForm's owned forms  
//***Let's say you're creating form1  
  
MyForm form1 = new MyForm();  
parentForm.AddOwnedForm(form1);//if you're in your parentForm's class use this.AddOwnedForm(form1);  
form1.Show();  
  
//***then when you want to close all of them simple call the below code  
  
foreach(Form form in parentForm.OwnedForms)  
{  
      form.Close();  
}  

Accepted Solution

philoware:

//***And also you can call this if you're in parentForm's class  
foreach(Form form in this.OwnedForms)  
{  
      form.Close();  
}  

Habe im übrigen kein EE Acc, lediglich 10 Sekunden Google bemüht.

10.11.2009 - 13:37 Uhr

Das könnte man ja über eine Tabelle in einer Datenbank machen.

04.11.2009 - 13:23 Uhr

Ich habe eine Lösung hier im Forum gefunden:

Vom entsprechenden Control einfach ableiten und dort
OnMouseWheel überschreiben.

In meinem Fall leite ich also ein eigenes Panel ab und überschreibe dort die Methode.

Danke für die Hilfe 😃
Birne

04.11.2009 - 11:17 Uhr

Hallo Community,

ich habe ine Frage bezüglich der automatisch angezeigten ScrollBars in einem Panel.
Die ScrollBars reagieren auf das Mausrad, scrollen wenn ich dieses betätige.

Welche Unternhemungen muss ich tätigen damit die Scrollbar nicht mehr auf das Mausrad reagiert ?

Danke
Birne 🙂