Laden...
S
sra myCSharp.de - Member
Luzern Dabei seit 21.01.2004
Benutzerbeschreibung

Forenbeiträge von sra Ingesamt 230 Beiträge

19.08.2009 - 15:18 Uhr

Hallo dN!3L

Ganz grandios! Genau so geht es (und macht auch Sinn).
Musste zwar vorgängig .ToList machen, da er den Befehl nicht in SQL umwandeln kann, aber funktioniert bestens.

Danke
sra

19.08.2009 - 14:13 Uhr

Hallo nochmal

Nochmal das Beispiel mit Benutzern und Registern, aber eine andere Frage.

Ich habe eine Tabelle Benutzer, eine Tabelle Register und eine Tabelle RegisterZuBenutzer, da jeder Benutzer mehrere Register haben kann und umgekehrt.

Oberhalb des Gridviews, das mir alle Kombinationen ausgibt, habe ich eine Checkboxlist, in der ich alle Register ausgebe. Wenn ich also ein oder mehrere der Register markiere und auf "filtern" klicke, dann sollen alle Benutzer ins Gridview kommen, die einem der markierten Registern zugewiesen sind.

Versucht habe ich es folgendermassen:


        Dim reg = From r As ListItem In Me.lstRegister.Items Where r.Selected Select r.Value
        For Each r In reg
            user = user.Where(Function(u) u.RegisterIDs.Contains(Integer.Parse(r)))
        Next

RegisterIDs ist eine List<integer>

Der Fehler da dran ist, dass mir dieser Code ANDs zwischen die Statements knüpft, obwohl ich da ORs bräuchte. Ausserdem bräuchte ich eine Klammer um all diese ORs, da ich unter umständen noch weitere Filter per .where anhänge (zB. Datumsfilter).

Wie muss ich das angehen?

19.08.2009 - 12:59 Uhr

Hallo zusammen

Vielen Dank für die schnellen Antworten!
String.Join ist genau das, was ich gesucht habe.

Gruss
sra

19.08.2009 - 11:40 Uhr

Hallo zusammen

Für eine Liste von Benutzern, die ich an ein Gridview binde, möchte ich gerne pro Benutzer eine Auflistung seiner "Register" haben. Jeder Benutzer kann 1-n Register zugeordnet haben (entsprechend einer 1:n Beziehung).

Nun möchte ich gerne die Liste der Register als ein String mit der kommagetrennten Auflistung aller zugeordneten Register von einem Linq Query zurückbekommen. Ist so etwas möglich?

Ich dachte erst, mit der .foreach könnte ich etwas anfangen, allerdings war das daneben gegriffen. Wie würded ihr so etwas angehen?

Gruss
sra

03.08.2009 - 18:24 Uhr

Manchmal muss man sich zum Affen machen um danach trotzdem nicht schlauer zu sein. Schlussendlich habe ich am völlig falschen Ort nach dem Fehler gesucht, und schlussendlich verstehe ich wie es zum Fehler kam nach wie vor nicht.

Die Lösung: Wenn ich die Zeile mit dem Iif(...) wo ich den Wert ausgebe ersetze mit einem normalen If ... Else, dann funktioniert das Ganze tadellos.

<%If (Einwohner(0).HasValue) Then Response.Write(Einwohner(0).Value.ToString("n0")) Else Response.Write("-")%>

Meiner Meinung nach sollte der Code genau dasselbe bewirken wie mein erstes Beispiel

<%=IIf(Einwohner(0).HasValue, Einwohner(0).Value.ToString("n0"), "-")%>

Vielleicht weiss ja noch einer aus dem Handgreif wieso das nicht klappt wie ich es ursprünglich wollte, aber das ist jetzt nicht derart wichtig.

Gruss und vielen Dank für die Hilfe
sra

03.08.2009 - 17:39 Uhr

Hallo Peter

Danke schonmal für die Antwort.

Ich glaube, dass mein Denkfehler hier ist (so stelle ich mir das vor):

Das Array müsste doch für die ersten 5 Positionen einen Wert haben, da es direkt beim Deklarieren auch initialisiert wird.

decimal?[] einwohner = { 0, 0, 0, 0, 0 };

Wenn ich nun im Page_Load den Wert des Arrays an der Position [0] mit einem "nulligen decimal" (also null, aber innerhalb eines nullable decimal) überschreibe, dann müsste imho das Array an dieser Position noch immer "vorhanden sein", der Wert des Inhaltes müsste an dieser Position dann einfach null sein.

naja.. Ganz offensichtlich verhält es sich hier anders.
Sorry wenn ich mich bisschen schwer tue, aber im Moment blicke ich nicht 100% durch.

Wie checke ich denn, ob das Array (das übrigens in diesem Falle für die Positionen 2-5 Werte hat) an dieser Stelle überhaupt einen Wert hat?

Gruss
sra

Edit: Betrachte es als "unwissendes Stochern im Dunkel", aber folgendes bringt nach wie vor eine NullReferenceException:

Not Einwohner(0) = Nothing AndAlso Einwohner(0).HasValue
03.08.2009 - 17:06 Uhr

Einwohner(i) wird erwartungsgemäss ab und zu mal null zurückgeben, wenn für das Jahr keine Daten erfasst sind. Deshalb habe ich das Ding auch als Nullable deklariert (decimal?) und frage bei der Ausgabe des Wertes .HasValue ab.

Im von dir empfohlenen Artikel kann ich nichts über Nullable Types lesen.

03.08.2009 - 16:26 Uhr

Hallo ihr

Ich zweifle grade grundlegend an meinem Verständnis von nullable Types (für euch csharper, so nennt man die Typen mit dem "?" hinten dran).

Folgendes dachte ich, müsste doch funktionieren (sorry für das VB).

Im Code behind habe ich einige Public Member initialisiert (natürlich ausserhalb irgendwelcher Methoden):

Public Einwohner() As Nullable(Of Decimal) = {0, 0, 0, 0, 0}

Im Page_Load fülle ich diese mit dem Resultat eines Linq Queries:

Einwohner(0) = (From p In kopfdaten Where p.kon_Konto = 810 And p.p.bmk_jah_Jahr = Year - 5 Select p.p.bmk_Betrag).Sum()

Das kann zugegebenermassen null ergeben, da unter umständen für das abgefragte Jahr keine Daten vorhanden sind.

In aspx greife ich auf den Public Member dann zu, wobei ich extra HasValue abfrage:

<td class="tdNormal" style="width:80px; text-align:right;"><%=IIf(Einwohner(0).HasValue, Einwohner(0).Value.ToString("n0"), "-")%></td>

Trotzdem kriege ich an dieser Stelle eine NullReferenceException.

Was habe ich nicht (oder falsch) verstanden?

Gruss
sra

Edit: Evt ist es fürs bessere Verständnis nötig zu erwähnen, dass der iif Befehl quasi das equivalent zum ?: Operator in csharp ist.

13.07.2009 - 12:50 Uhr

mooment... wenn ich das child mitselektiere, habe ich natürlich jede erdenkliche Tiefe. Allerdings kann der Repeater da nicht mit umgehen und ich müsste also dynamisch weitere Repater innerhalb des vorherigen Repeaters erstellen.

Geht es wirklich nicht so einfach ein Menü nachzubauen, das dynamisch in der Tiefe ist, ohne die ganzen Menücontrols und -provider?

edit: zum Thema div-Suppe hast du natürlich recht. Entweder gibt es nicht-hirarchische Links (<a>) mit der level als clientId, oder es gibt korrekt verschachtelte listen 😃

13.07.2009 - 12:42 Uhr

Hallo Peter

Die Tiefe brauche ich nur für die Darstellung, sprich das CSS.
Ich kann eigentlich darauf verzichten, indem ich divs entsprechen der Relation einfach verschachtle und dann per CSS Selektor die Verschachtelung aufgreife, aber irgendwo ist das für mich auch nur Neugier, wie man das mit dem Level wohl umsetzt 😃

Aber auch ohne die Level-Property. Wenn ich im SELECT des Queries die Childs (als Collection - ich habe mir entsprechend eine Association im dbml erstellt) einfach mitselektiere, dann habe ich erst eine Tiefe. Wie mache ich das mit 2, 3 oder 5 Levels?

btw. ich weiss, dass ich mit ASP.NET fertige Menübausteine habe und auch den entsprechenden Provider für meine DB Stuktur irgendwo finden würde (oder ASP.NET meine DB Stuktur machen lassen kann), aber die will ich mal aussen vor lassen, weil ich ein sehr kleines Projekt habe, in dem möglichst viel händisch machen will.

13.07.2009 - 11:28 Uhr

Hallo allerseits

Ich möchte eine Art Menüstruktur per Linq aus der DB lesen. Natürlich habe ich das mit einer Parent Child Beziehung gemacht, so dass jeder Menüpunkt einem anderen untergeordnet werden kann.

Jetzt ist es so, dass ich gerne zu den Datenbankfeldern ein zusätzlicher Member namens Level hätte. Sprich: ein Linq Query, das mir alle Einträge in der richtigen Reihenfolge aus der Datenbank holt (also das Child von Eintrag 1 noch vor dem Eintrag 2) und gleichzeitig die "Tiefe" der Verschachtelung erkennt.

Leider habe ich gemerkt, dass ich da ziemlich an meine Linq Grenzen stosse. Vor allem auch, weil ich nicht weiss wie viele "Level" da überhaupt in der DB stecken, ich also quasi einen rekursiven Linq Query bräuchte.

Wie würded ihr so etwas angehen?

Gruss und Danke schonmal für die Inputs

22.06.2009 - 14:57 Uhr

Hier noch meine Lösung. Warum es aber anders rum nicht geht, versteh ich noch immer nicht.

Me.ddlKanton.Items.AddRange((From k In db.Kantones Order By k.kan_Name Select New ListItem(k.kan_Name, k.kan_ID)).ToArray())
17.06.2009 - 11:00 Uhr

Hallo dN!3L

Ich habe jetzt ein Testprojekt erstellt, mit nichts als einer Dropdownlist und einer Tabelle in einem dbml File und folgendem Code im Page_Load:

this.ddlKontogruppe.DataSource = (from k in db.Kontengruppens select new ListItem() { Text = k.kog_Name, Value = k.kog_Count.ToString() }).ToList();

Leider funktioniert selbst das nicht. ToList hat auch in meinem ersten Query keinen Unterschied gemacht.

Bug?

16.06.2009 - 15:39 Uhr

Ich loope halt über die Collection und adde die Einträge manuell. Bist du sicher, dass es bei dir geht? Bei mir geht es schon auch, aber der Value ist halt immer gleich wie der Text - auch wenn ich beim Value die ID des Datensatzes angebe und beim Text den Namen.

Wenn das bei dir wirklich geht, dann weiss ich echt nicht weiter. So viel kann man ja gar nicht falsch machen.

16.06.2009 - 13:51 Uhr

Da hier scheinbar (anscheinend?) keiner eine Ahnung hat lade ich euch alle zum wilden Spekulieren ein 😃

Ist das ein Bug oder raff ich ein zugrundeliegendes Prinzip nicht?

Nachtrag: ich hab das jetzt halt anderst gelöst, was ja kein Problem ist. Aber es wäre halt schon khul so wie ich das wollte.

10.06.2009 - 15:03 Uhr

Hallo

Ich versuche gerade den totalen Dropdownlist-füll-overkill, indem ich folgendes versuche:

Me.ddlGruppe.DataSource = From g In db.Kontengruppens Select New ListItem(g.kog_Name, g.kog_Count)

Auf den ersten Blick hat das super funktioniert und ich bin begeistert. Allerdings habe ich dann gemekrt, dass der Value und der Text des Listitems immer derselbe ist. Sprich, in diesem Falle ist der Value der Name und nicht der Count.

Kann mir das jemand erklären?

04.06.2009 - 17:48 Uhr

naja.... Es fängt ja schon bei **int? **oder dim as nullable(of integer) an und geht dann so weiter. p => oder **function(p) **.

Den ? : Operator gibt es gar nicht und wie man unter VB.net eine Instanz einer Klasse erstellt und nach belieben im selben Befehl noch Properties auf füllt, weiss ich bis heute nicht.

Ich werde bei uns in der Firma ab und zu gerufen um ein CSharp Codeschnipsel nach VB zu übersetzen - auch wenn die anderen das natürlich auch könnten, würden sie sich mal kurz mit CSharp auseinandersetzen.

04.06.2009 - 17:27 Uhr

VB wird ja in der nächsten Version auch schöner (dann braucht es die _ nicht mehr für Zeilenumbrüche innerhalb eines Befehls), aber bei den CSharp jungs ist man schon kompetenter aufgehoben 😄

Ausserdem kann man von CSharpern erwarten, dass sie VB lesen können - umgekehrt nicht unbedingt.

Gruss von einem verhinderten CSharper, der aber eh bald auf Kunst umsteigt ^^

04.06.2009 - 16:17 Uhr

lol

Kaum habe ich im Titel geschrieben "... von zwei Listen", da merke ich, dass ich ja wirklich Listen draus machen könnte, da ich - wie im Beispiel ersichtlich - bisher "nur" IQueryables hatte. Und siehe da: klappt.

Danke trotzdem 😃

04.06.2009 - 16:12 Uhr

Hallo zusammen

Ich habe da grade wieder ein kleines Problem im Zusammenhang mit Linq to SQL.

In einem Tool von uns kann man "Besuche" speichern. Sobald ein Besuch gelöscht wird, kommt er aus der Tabelle "Besuch" raus in die "Besuch_Archiv" Tabelle (wieso auch immer nicht einfach ein Status gesetzt wird). Mein Auftrag ist es nun eine Suche über beide Tabellen hinweg zu realisieren.

Gelöst habe ich das mit zwei Abfragen, welche mir die Daten von jeweils einer der Tabellen holen. Danach werden die beiden per Union zusammengefügt, sortiert und ans Grid gebunden.

Um in beiden Abfragen den gleichen Typ zu haben (also keinen anonymen) habe ich mir eine Klasse erstellt, in die ich dann die Resultate per select new SuchResultat(...) speichere. Das Problem ist, dass die Archivtabelle zusätzlich die beiden Felder gelöschtAm und gelöschtVon enthält. Natürlich enthält meine SuchResultat-Klasse diese beiden Felder auch. Wenn ich nun aber folgendes mache, bekomme ich einen Fehler:


        Dim result = From b In besuche _
                     Select New Suchergebnis( _
                         b.b.BeBesuchsNr, _
                         ..., _
                         Nothing, _
                         Nothing)

        result = result.Union(From b In besuche_archiv _
                     Select New Suchergebnis( _
                         b.b.BeBesuchsNr, _
                         ...
                         b.b.BeGeloeschtVon, _
                         b.b.BeGeloeschtAm))

Der Fehler ist folgender: System.Data.SqlClient.SqlException: Alle Abfragen in einem Abfrageausdruck, die einen UNION-Operator enthalten, müssen gleich viele Ausdrücke in ihren Auswahllisten enthalten.

Hat jemand schon erfahrungen damit gemacht? Meiner Meinung nach sollte man die zwei Listen der Klasse SuchResultat doch zusammenfügen können, auch wenn ich im nicht genau die selben Werte dem Konstruktor übergeben.

Gruss
sra

28.05.2009 - 13:41 Uhr

Hallo Latino

Danke übrigens zunächst mal für deinen Support hier.

Wenn ich die Klasse direkt als new angebe, kann ich mir schon mal den foreach sparen, der die Resultate aus dem anonymen iqueryable in die Liste meiner klasse umgeschichtet hat.

Trotzdem habe ich noch eine Klasse erstellt, nur um die Daten anständig "zwischen"speichern zu können. Die Datenstruktur dieser Klasse (Datum, ArtikelName, Anzahl, KofferCode) brauche ich sonst nirgends. Wenn mir einen ganz normalen Linq Query erstelle, welcher mir die Daten in dieser Form zurückgibt (ohne Angabe einer Klasse), dann erstellt er mir ja automatisch einen anonymen Typen, auf welchen ich im folgenden zugreifen kann.
Speichere ich das Resultat des Query jedoch auf Klassenebene um von einer anderen Methode zugreifen zu können, dann weiss der Compiler die einzelnen Member nicht - ich kann diese also nicht weiterverwenden (zumal ich ja auch gar nicht weiss in welchen Typen ich casten müsste).

Gibt es eine Möglichkeit wie ich z.B. definiere, dass der Rückgabetyp eine aut. erstellte Klasse sein soll, die der Compiler dann auch kennt. Naja - wär vielleicht nicht so logisch, also gibt es das wahrscheinlich nicht, aber ich frage trotzdem mal ganz leise nach 😃

28.05.2009 - 11:05 Uhr

Hallo Latino

Der generierte Query war echt eine Augenweide ^^
Zwar kann unser alter SQL Server hier noch kein Profiling (glaube ich), aber man kann sich ja den Query mit .toString in ein LogFile schreiben lassen.

Ich habe deinen Rat befolgt und den Linq Query in zwei Teile gesplittet. Der erste liest mir die Daten aus der DB in eine Liste und der zweite gruppiert diese dann so wie ich das will. Dauert zwar noch immer 2 Sekunden, aber damit kann ich leben.

Kleine Frage am Rande noch dazu:
Da ich für jede Woche ein Grid binde (innerhalb eines Repeaters), habe ich den ersten Query (bringt mir gleich die Daten für das ganze Jahr) nicht in der selben Funktion wie den zweiten der diesem noch das Wochenkriterium hinzufügt und gruppiert.
Da aber das Resultat der ersten Abfrage einen "neuen" anonymen Datentyp hervorbringt, kennt die zweite Funktion dessen Members nicht, auch wenn ich natürlich Zugriff habe. Ich habe mir deshalb eine Klasse gemacht, und habe das Ergebnis des ersten Queries per foreach in eine list<meinerKlasse> geadded. Gäbe es da eine elegantere Möglichkeit?

27.05.2009 - 16:32 Uhr

Hallo Allerseits

Ich mache für ein aktuelles Projekt eine statistische Auswertung der Anzahl verkaufter Produkte (Geschenkartikel) pro Koffer (die Artikel sind an Koffer "gebunden" und es intressiert mit welchem Koffer welche Artikel am ehesten weggehen).

Auf der DB Seite habe ich folgende Tabellen:

  • BestellKopf
  • BestellDetail (fk zu BestellKopf, fk zu GeschenkArtikel)
  • GeschenkArtikel
  • FakturaKopf (fk zu BestellKopf)

Die Abfrage sieht so aus:

From p In db.BestellungsDetails() _
Where p.Bestellung.Datum >= DatumVon _
And p.Bestellung.Datum <= DatumBis _
Group p By p.GeschenkArtikel.Gruppe Into Group _
Select _
    Produkt = Gruppe, _
    Braut = Group.Where(Function(g) g.Bestellung.Quelle = 1 And g.Menge > 0).Sum(Function(g) g.Menge), _
    Baby = Group.Where(Function(g) g.Bestellung.Quelle = 2 And g.Menge > 0).Sum(Function(g) g.Menge), _
    JuFa = Group.Where(Function(g) g.Bestellung.Quelle = 3 And g.Menge > 0).Sum(Function(g) g.Menge), _
    FTop = Group.Where(Function(g) g.Bestellung.Quelle = 5 And g.Menge > 0).Sum(Function(g) g.Menge), _
    Post = Group.Where(Function(g) g.Bestellung.Quelle = 6 And g.Menge > 0).Sum(Function(g) g.Menge), _
    INet = Group.Where(Function(g) g.Bestellung.Quelle = 7 And g.Menge > 0).Sum(Function(g) g.Menge), _
    ADM = Group.Where(Function(g) g.Bestellung.Quelle = 0 Or g.Bestellung.Quelle Is Nothing And g.Menge > 0).Sum(Function(g) g.Menge), _
    Total = Group.Sum(Function(g) g.Menge), _
    Ret = Group.Where(Function(g) g.Menge < 0).Sum(Function(g) g.Menge) * -1()

Wenn ich die so ausführe, dann dauert es ganz schön lange. Allerdings kann ich den generierten SQL Query anhand von Loadoptions schon einigermassen optimieren.


lo.LoadWith(Of Data.BestellungsDetail)(Function(p) p.Bestellung)
lo.LoadWith(Of Data.Bestellung)(Function(p) p.FakturaKopfs)
lo.LoadWith(Of Data.BestellungsDetail)(Function(p) p.GeschenkArtikel)

Trotzdem dauert die Abfrage noch sehr lange (x Sekunden), sobald ich statt des Rechnungsdatums (wie im query oben) das FakturaDatum nehme (also statt Where p.Bestellung.Datum ≥ DatumVon gibt es eben Where p.Bestellung.FakturaKopfs.FirstOrDefault.Datum ≥ DatumVon). Weiss jemand weiter? Wie kann ich Loadoptions über zwei Verknüpfungen hinweg definieren?

Ausserdem sollte ich in diesem Query noch irgendwie nachträglich ein WHERE auf die Sprache (im Bestellkopf) setzen können. Allerdings ist er natürlich zu dem Zeitpunkt schon gruppiert und hat das Sprachefeld nicht im Angebot. Zwei verschiedene Queries (für beide Sprachen) will ich aber vermeiden. Wie würded ihr da vorgehen?

Wäre sehr khul wenn sich jemand mit mehr Ahnung kurz Zeit nimmt.

Danke und gruss
sra

23.12.2008 - 18:46 Uhr

Hallo Leute

Ich habe eine einfache Tabelle, in welcher Transaktionen von Artikeln gespeichert sind. Also Datum, ArtikelNr, Benutzer und Anzahl (sowohl positiv als auch negativ). Ich möchte eine nach Benutzer und Datum gruppierte Auflistung mit dem Datum auf der einen und Artikeltyp auf der anderen "Achse". Den Artikeltyp bestimme ich anhand der letzten Ziffer der ArtikelNr.

Um das zu erreichen, brauche ich unterabfragen in Linq, welche etwa so aussehen (wobei Group nicht der Befehl, sondern der Name der Gruppe ist - VB sei dank):

(From t2 In Group Where t2.Artikel.Name.EndsWith("01") Select t2.Anzahl).Sum()

Das Problem ist, dass der Sum Befehl zwangsläufig eine Exception wirft, wenn die Unterabfrage kein Resultat zurück bringt. Die Fehlermeldung lautet: Der NULL-Wert kann keinem Element vom Typ "System.Int32" zugeordnet werden, der keine NULL-Werte zulässt.
Allerdings habe ich die "Variable" nicht (und damit auch nicht als Integer) definiert in die das Resultat abgelegt werden soll.

Hier mal der ganze Code:


            Dim stat = From t In data.KofferTransaktions _
                       Group By t.fk_Hostess, t.Datmut Into Group _
                       Select New With { _
                            .Hostesse = fk_Hostess, _
                            .Datum = Datmut, _
                            .Braut = (From t2 In Group Where t2.Kofferserie.Name.EndsWith("01") Or t2.Kofferserie.Name.EndsWith("02") Or t2.Kofferserie.Name.EndsWith("07") Select t2.Anzahl).Sum(), _
                            .Baby = (From t2 In Group Where t2.Kofferserie.Name.EndsWith("03") Or t2.Kofferserie.Name.EndsWith("04") Or t2.Kofferserie.Name.EndsWith("08") Select t2.Anzahl).Count(), _
                            .JuFa = (From t2 In Group Where t2.Kofferserie.Name.EndsWith("05") Or t2.Kofferserie.Name.EndsWith("06") Select t2.Anzahl).Count(), _
                            .FTop = (From t2 In Group Where t2.Kofferserie.Name.EndsWith("15") Or t2.Kofferserie.Name.EndsWith("16") Or t2.Kofferserie.Name.EndsWith("17") Select t2.Anzahl).Count() _
                        }

hat jemand eine Idee?

15.10.2008 - 16:27 Uhr

Hallo Forum

Ich bin seit kurzem daran Linq (vorwiegend To Sql - ich hoffe ich bin damit im richtigen Forum) in meinen Projekten zu gebrauchen, bin aber bereits relativ schnell an die erste Hürde gestossen. Und zwar habe ich Probleme mein (ASP.NET) Gridview zu sortieren, weil ich nicht die LinqDatasource einsetze.

Im Moment sieht mein Code so aus, dass ich im Page_Load direkt einen Query an die Datasource des Gridviews haue.


    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not Me.IsPostBack Then
            Me.btnFilterAnwenden_Click(Me, Nothing)
        End If
    End Sub

    Protected Sub btnFilterAnwenden_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnFilterAnwenden.Click
        Dim msgs = Nachrichten.GetNachrichten
        If Not Me.ckFilterTypAllgemein.Checked Then msgs = msgs.Where(Function(p) p.Typ <> 1)
    ...
        Me.grdNachrichten.DataSource = msgs
        Me.grdNachrichten.DataBind()
    End Sub

sry, wegen VB - eure Antworten und Beispiele dürfen gerne auch in csharp sein, aber das Geschäft... 😠

Naja - jedenfalls klappt das soweit (auch mit den Filtern) tiptop. Nachricht.GetNachrichten bringt ein IQueriable<Nachricht> zurück, das schon so gefiltert wurde, dass nur die eigenen Nachrichten drin sind. Achja - function(p) ist die VB Variante von p =>.

Wie muss ich nun vorgehen, um das Gridview sortiert zu bekommen? Ich habs folgendermassen versucht:

    Protected Sub grdNachrichten_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles grdNachrichten.Sorting
        Dim msgs = Nachrichten.GetNachrichten
        If e.SortDirection = SortDirection.Ascending Then
            If e.SortExpression = "fk_Absender" Then msgs.OrderBy(Function(p) p.fk_Absender)
            ...
        Else
            If e.SortExpression = "fk_Absender" Then msgs.OrderByDescending(Function(p) p.fk_Absender)
            ...
        End If
        Me.grdNachrichten.DataSource = msgs
        Me.grdNachrichten.DataBind()
    End Sub

Mir ist klar, dass das noch nicht ganz koscher ist, falls denn ein Filter gesetzt gewesen wäre, dass dieser den Sort nicht überlebt, aber auch das mit dem Sort klappt nicht. Ausserdem wäre eine Variante wünschenswert, in der man der .OrderBy Methode einen String statt eines Lambdas übergeben könnte (oder einen Lambda anhand des Strings dynamisch generieren).

Wäre echt für Hilfe dankbar - finde dazu nichts was ich auch verstehe (da ich mich noch zu wenig mit anonymen Methoden / Lambda Expressions und Linq Expression Trees auseinandergesetzt habe).

Vielen Dank
Gruss
sra

05.09.2008 - 15:38 Uhr

Du hast mich ertappt 🙂

Habe ein kleines Demoprojekt gemacht um den Fehler zu reproduzieren, und konnte das nicht.

Der Fehler war nicht verursacht durch die Umstellung auf die Masterpage, sondern auf den Redirect. Den habe ich letzte Woche eingebaut und demnach nicht getestet (sonst nicht meine Art).

Also - alle die diesen Post lesen: Es gibt keinen Unterschied in der Handhabung von Registerclientscriptblock bei Scriptmanager und Scriptmanagerproxy! 🙂

Gruss
sra

05.09.2008 - 15:28 Uhr

Hallo Peter

Danke für den nütlichen Input. Ich habe tatsächlich Firefox bisher noch nie für Javascript benutzt, sondern halt nur für css.

Der Fehler war aber woanders zu suchen. Ich hatte nach dem obigen Code (erste Zeile) einen Response.Redirect drin.
Mit dem Scriptmanager direkt im Form, wurde der Redirect erst ausgelöst, wenn ich das Javascript Alert weggeklickt hatte. Mit dem Scriptmanager in der Masterpage verhält es sich nicht so. Ich kann mir dies zwar nicht restlos erklären (schliesslich dürfte doch der Scriptblock mit meinem Alert nach wie vor direkt am Anfang der Seite gerendert werden), aber wenn ich drauf verzichte funktionierts halt 🙂

Gruss
sra

05.09.2008 - 13:56 Uhr

Hallo

Um dem benutzer Serverseitig generierte Mitteilungen in einem asynchronen Postback zu zeigen, benutze ich die Methode ScriptManager.RegisterClientScriptBlock. Hat bis jetzt immer sehr gut geklappt. Nun habe ich aber das Design vereinheitlicht und setze daher auf Masterpages, was vorher nicht der Fall war.

Daher habe ich auch keinen Scriptmanager mehr direkt auf der Seite sondern einen Scriptmanagerproxy (den Scriptmanager natürlich in der Masterpage). Updatepanels und alles andere funktioniert genau gleich wie vorher, nur meine Mitteilungen werden nicht mehr ausgegeben. Irgendwie bringt mich google in dieser Sache nicht weiter, denn alles was da vorgeschlagen wird will nicht klappen.

hier mal was ich versucht habe:

            // Hat vorher geklappt
            ScriptManager.RegisterClientScriptBlock(Me.Page, Page.GetType(), Guid.NewGuid.ToString(), "alert('" & notfound & "');", True)
            // Klapp beides nicht
            ScriptManager.RegisterStartupScript(Me.Page, Page.GetType(), Guid.NewGuid.ToString(), "alert('" & notfound & "');", True)
            ScriptManagerProxy.Page.ClientScript.RegisterClientScriptBlock(Page.GetType(), Guid.NewGuid.ToString(), "alert('" & notfound & "');", True)

Hat jemand schon ähnliche Erfahrungen mit dem Scriptmanagerproxy gemacht und weiss wies geht?

26.06.2008 - 17:34 Uhr

Ich habe als Test die Produkt-Klasse abgeleitet und nichts überschrieben, sondern nur eine zusätzliche Property gemacht, die sich aus zwei anderen (schon bestehenden) Properties zusammensetzt - so einfach wie möglich für den Test.

Danach habe ich versucht in einer Schleife über die "alte" ProduktCollection jeweils das Produkt in ProductExtendet zu casten, was zu einer InvalidCastException führt.

Wenn ich das richtig im Kopf habe, darf das ja auch gar nicht funktionieren, weil du immer auf die Basisklasse casten kannst, aber von der Basisklasse nicht auf die geerbte. Somit müsste ich imho eine eigene ProduktCollection machen, die von der echten ProduktCollection erbt, und deren Item Eigenschaft überschreiben.

Und genau hier weiss ich nicht weiter, weil die von Subsonic Generierte ProduktCollection Klasse sieht genau so aus:


	/// <summary>
	/// Strongly-typed collection for the SitzungsTermin class.
	/// </summary>
	[Serializable]
	public partial class ProduktCollection : ActiveList<Produkt, ProduktCollection> 
	{	   
		public ProduktCollection() {}

	}

nicht mehr, nicht weniger.

Ich werd noch ein bisschen probieren - mir ist da grad ne Idee gekommen. In der Zwischenzeit bin ich um Hilfe froh 😁

26.06.2008 - 16:23 Uhr

Hallo

Ich arbeite für ein bereits älteres Projekt, in dem wir für die DAL Subsonic einsetzen. Bisher habe ich die Klassen der DAL über partielle Klassen erweitert, so dass ich einige eigene Eigenschaften hatte, die nicht in der Datenbank wiedergegeben werden. Das klappte sehr gut.

Nun haben wir die DAL in ein eigenes Projekt gesteckt (Hintergrund: wir arbeiten neu mit WCSF) und in der Folge davon, kann ich meine partiellen Klassen nicht mehr brauchen, weil diese keine Klassen erweitern dürfen, die nicht im selben Projekt stecken.

Kurzum: Neu muss ich von der Subsonic Klasse ableiten bzw. erben um meine Eigenschaften da rein zu kriegen. Nun habe ich in der Theorie das schon gemacht, aber bei den Subsonic Klassen sieht es ein bisschen anders aus. Und zwar ist mein grosses Problem, dass diese Klassen aus einer "Produkt"-Klasse und einer "ProduktCollection"-Klasse bestehen und ich wahrscheinlich beide ableiten muss. Ich will aber nur minimale Änderungen im "Produkt" und in der Collection davon soll alles beim alten bleiben.

Wie muss meine abgeleitete Collectionklasse aussehen und was muss ich evt. noch machen, dass die Funktionalität weiterhin bestehen bleibt (DB Abfrage, speichern etc)

03.06.2008 - 15:42 Uhr

Wenn du dir ein Templatefield machst, kann es mit jedem x-beliebigen Control füllen (bearbeiten kannst du es, indem du oben rechts des Grids auf den "Pfeil" klickst und dann Templatefield bearbeiten wählst).

Probiers ma mit nem einfachen Hyperlink Control. Hab ich zwar noch nie benutzt, aber ich habe gesehen, dass es eine Property namens "ImageUrl" hat.

edit: dann kannst du dir aber auch direkt ein Hyperlinkfield machen (sofern es das gibt... hatte schon paar Monate nicht mehr direkt mit Gridviews zu tun 😄)

30.05.2008 - 16:38 Uhr

Beschreib doch bitte mal die genaueren Umstände deiner Frage. Ich bin mir recht sicher, dass Masterpages oder Usercontrols für dich die bessere Lösung sind, als das IFrame (obwohl dieses sicher schneller implementiert ist, da man weniger überlegen muss)

30.05.2008 - 00:10 Uhr

Du musst beachten, dass du die dynamisch erstellten Controls bei jedem Postback neu erstellen musst, damit diese ihre Werte behalten. Sprich, du müsstest den Code zum Erstellen der Controls in die Page_Load (oder Page_Init, wie Peter sagt) verschieben - den Aufruf deiner Methode natürlich. Kannst das ja abhängig vom Wert in einer Dropdownlist oder einer Textbox machen.

27.05.2008 - 16:04 Uhr

Also...
Du willst, dass der Benutzer eine URL eingibt, welche dann im WebBrowserControl dargestellt wird?

Dazu reicht eine klitzekleine Zeile Code!
this.wbWebBrowserControl.URl = this.txtUserURl.Text;

Möchtest du den HTML Code der Webseite, die der User eingibt, jedoch manipulieren, dann musst du selber im entsprechenden MSDN Eintrag nachschauen gehn, wie man das am Besten macht.

27.05.2008 - 11:02 Uhr
  1. Zieh ein Webbrowser Control in dein Form
  2. In den Properties des Webbrowsers, setze die "URl" auf "http://www.yahoo.fr"

et voila

27.05.2008 - 10:50 Uhr

Du versuchst das mit WinForms - da kann ich dir leider nicht weiterhelfen.

Aber so als Tip: Wenn du einen Text in einem String speichern willst, dann musst du nur einen String erstellen (string myString = "hallo welt"😉 und nicht den Text in die Text Eigenschaft einer Textbox pressen.
Ausserdem solltest du deinen Beitrag jeweils vor den abschicken nochmal durchlesen!

27.05.2008 - 10:41 Uhr

du hast eine asp.net seite, und möchtest eine "fremde" Seite darstellen, deren HTML du in einem String gespeichert hast? Ich würde mal einfach ein literal Control in dein aspx ziehen und dieses in Code Behind mit dem HTML füllen.

23.05.2008 - 10:07 Uhr

Also wenn du unter "vertikale Richtung" untereinander verstehst, dann musst du bloss 2 divs machen. Die sind immer automatisch untereinander.

14.05.2008 - 11:38 Uhr

Würde das mit CSS lösen. Schau mal, welche Eigenschaften du auf Table Ebene hast. Ich bin der Meinung da gibt es etwas wie layout:fixed; womit du Zeilenumbrüche erzwingen kannst (natürlich nur in Kombination mit einer fixen Breite)

13.05.2008 - 10:35 Uhr

Ich könnte mir vorstellen, dass der SQL Server so gesichert ist, dass er keine Connections von "aussen" zulässt (er also nur von der Maschine mit dem IIS erreichbar ist). Allerdings glaube ich kaum, dass das sehr verbreitet ist, da der Hoster so doch den Komfort des Entwicklers recht einschränkt.

09.05.2008 - 15:40 Uhr

Hallo

Ich hätte dieses Projekt noch so gerne in ASP.NET realisiert, aber das Budget erlaubt keine Neuprogrammierung sondern ledeglich Anpassungen am alten Projekt (was natürlich zeitlich weit weniger Aufwand ist). Und schliesslich bin ich nicht Chef sondern Entwickler 😠

Ich werd mir den UltraEdit mal ziehen - danke für den Tip. Ich glaube ich habe damals (als ich in der Lehre mal asp hatte) den VB6.0 Editor... bin mir aber nicht mal mehr sicher was ich damals hatte.

09.05.2008 - 14:03 Uhr

Hallo Forum

Ich habe gerade den Auftrag gefasst ein altes Projekt zu modifizieren. Leider erlaubt das Budget keine Migration auf ASP.NET und eine vernünftige Datengrundlage (sprich Access ersetzen), weshalb ich mich nun wieder an classic ASP wage.

Mein Problem ist, dass ich nicht so recht weiss, mit was ich diese Dateien bearbeiten soll. Irgendwelche Uralt-editoren habe ich grad nicht auf CD (und will ich eigentlich auch gar nicht), aber VS 2008 bietet mir kein Code Highlighting und kein IntelliSense. Gibt es eine Möglichkeit diese beiden nachträglich noch ins VS08 zu packen? Oder mit was arbeitet ihr?

Gruss
sra

02.05.2008 - 08:56 Uhr

Die Antwort auf deine Frage ist, Ja das geht!

Du kannst mit dem SQL Server Management Studio Express auch MS SQL Datenbanken administrieren, welche ohne das "Express" laufen.
Mein Anbieter bietet das (also den Zugriff auf die DB über Tools) und imho sollte das auch Standard sein. Oder wie zieht ihr euer DB Schema in ein Linq File? Da muss das VS ja auch Zugriff auf die DB haben - da braucht es doch gar nichts spezielles ausser dass der ConnectionString halt stimmen muss.

Gruss
sra

Edit: MySQL wird wohl nicht gehen.

14.04.2008 - 13:59 Uhr

Ok... nach einigem Versuchen und teilweise selber anzweifeln meiner Denkfähigkeit im Moment (Montag...), habe ich kurzerhand ein Testprojekt in c# gemacht, und da klappt alles so wie ich es mir von anfang an vorgestellt habe und wie es Programmierhans beschreibt.

Also ist mein Problem nun, dass dieser Code funktioniert:


        DataTable dt = new DataTable();
        dt.Columns.Add(new DataColumn("Datum", typeof(DateTime)));

Dieser (VB) aber nicht:


                Dim dt As New DataTable
                dt.Columns.Add(New DataColumn("Datum", typeof(datetime)))

Der Fehler ist "datetime is a type and cannot be used as an expression" bzw. "Is expected".

Kann es sein, dass typeof in VB anders implementiert ist in c#?
Werd ma an der Sache dranbleiben

Edit: Ja es ist anderst implementiert.
Für VB.NET ist GetType(Integer) das equivalent zu typeOf(string). Logisch bin ich da verwirrt, wenn ich fast nur csharp Lektüre lese 😠

14.04.2008 - 13:25 Uhr

Hallo Programmierhans

Deine Antwort war noch schneller als mein Edit 🙂
Naja - es ist mir ja eigentlich schon klar was die beiden tun. Nur bin grade bisschen frustriert, weil ich keine andere Möglichkeit sehe und ich eigentlich dachte, dass Strings übergeben passè ist.

14.04.2008 - 13:18 Uhr

Hallo

Ich hab da grade eine kurze Frage auf der Zunge.
Es geht um folgende Codezeile:

Dim dt As New DataTable
dt.Columns.Add(New DataColumn("Datum", System.Type.GetType("System.DateTime"))

Was mich daran stört (ausser dass es VB ist), ist die Tatsache, dass ich den Typ als String übergeben muss. Gibt es keinen anderen Weg? Und was machen verdammtnochmal Typeof und GetType genau?

Edit: Ok - TypeOf vergleicht und GetType gibt den Typ eben aufgrund des Strings zurück. Aber da muss es doch einen Weg geben dem den Typen nicht als String übergeben zu müssen.

07.04.2008 - 10:29 Uhr

Ich habe auch mal einige dieser Editoren für mich ausprobiert, und bin zum Ergebnis gekommen, dass die FreeTextBox passt. http://freetextbox.com/default.aspx

Aber wenn du etwas wirklich professionelles willst, dann gib ein bisschen Geld dafür aus und nimm dieses hier: http://www.telerik.com/DEMOS/ASPNET/Prometheus/Editor/Examples/Default/DefaultCS.aspx

02.04.2008 - 13:28 Uhr

... oder so ähnlich 😁
(irgendwo im Board müsste noch ein ähnlicher Beitrag von mir sein)

02.04.2008 - 09:01 Uhr

Der Begriff, nach dem du googlen kannst ist (glaub ich) pop fly menu.
Du findest sicher etwas von und mit asp.net.

26.03.2008 - 12:05 Uhr

Ich glaube mich erinnern zu können, dass man Trigger für Updatepanel nicht dynamisch erstellen kann (was sich aber inzwischen geändert haben kann).

Allerdings glaube ich du hast da grundsätzlich etwas zu kompliziert aufgebaut. Wenn deine Controls (Buttons) innerhalb des Updatepanels sind, dann wird der Event eh asynchron ausgeführt - du brauchst dafür keine Trigger. Voraussetzung ist allerdings, dass du deine Buttons beim dynamischen erstellen auch an einen Event hängst.

Vielleicht wäre es einfacher, wenn du eine DataList oder einen Repeater verwendest. Dann kannst du den Button zur Designzeit definieren und hast es auch mit dem dahinterliegenden Event einfacher (sprich - Doppelklick). Ausserdem kannst du dann Triggern wie du willst.

Edit: Hast du NUR den Text im Updatepanel? Pack einfach das ganze "Ding" ins Updatepanel!