Bestellung GridView-Problem

  • ASP

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von Outer.

    Bestellung GridView-Problem

    Hallo allerseits,

    Ich habe folgendes Problem. Meine Schleife (for each) wird mehr oder weniger ignoriert. ich poste einfach mal den Code:

    Visual Basic-Quellcode

    1. Dim menge As Integer = 0
    2. Dim artikel As String
    3. For Each artikel In art
    4. Dim vergleich As String
    5. For Each vergleich In art
    6. For Each row As GridViewRow In GridView1.Rows
    7. If artikel Is vergleich Then
    8. menge = menge + 1
    9. Dim lmen As Label = row.FindControl("gridviewlabelmenge")
    10. lmen.Text = menge
    11. Else
    12. Dim lmen As Label = row.FindControl("gridviewlabelmenge")
    13. lmen.Text = 1
    14. End If
    15. Next
    16. Next
    17. Next


    auf der asp seite sieht es so aus:

    HTML-Quellcode

    1. <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    2. DataSourceID="SqlDataSource1" Width="100%">
    3. <Columns>
    4. <asp:TemplateField HeaderStyle-Width="10%" HeaderText="Menge">
    5. <ItemTemplate>
    6. <asp:Label runat="server" ID="gridviewlabelmenge"></asp:Label>
    7. </ItemTemplate>
    8. </asp:TemplateField>
    9. </Columns>
    10. </asp:GridView>


    Es soll also in jeder Zeile der weit angegeben der verglichen wird. Etwas konfus. Ich weiß ;)
    Kann mir da bitte jemand helfen. Ich Stoße hier wirklich an meine Grenzen.

    Danke schon mal und mit freundlichen Grüßen
    Outer

    icemanns schrieb:


    Okay.

    Und in welche ForEach geht er nicht rein bzw. was heißt mehr oder weniger ignoriert?

    Hier (
    For Each row As GridViewRow In GridView1.Rows
    ) geht er nicht mehr rein bzw. stellt damit nichts mehr an. Wenn ich die Schleife aber ausserhalb der anderen Schleifen und der Bedingungen setze, nimmt er sie sehr wohl an.




    icemanns schrieb:


    Hast du es Step-by-Step gedebuggt?

    Ja, aber hat mit nur gezeigt wo er eben nicht mehr rein geht. Mehr konnte ich nicht herausfinden.



    icemanns schrieb:


    Ist es Absicht das du 2x Art durchläufst? 1x mit Artikel und 1x mit vergleich?


    Ja, so will ich vergleichen ob ein Wert im Array noch einmal in einem Anderen ist.*

    *) Ich hol mal etwas weiter aus:
    Ich übergebe mittels einer Session einen String den ich dann so teile:

    Visual Basic-Quellcode

    1. art = best_step2.Split(";")

    Und so wird aus dem einen String viele einzelne in einem Array
    Ich weiß ist bisschen blöd, aber hast du die ForEach schon mal durch eine normale For-Schleife ersetzt.
    Rein nur zum testen ob er sie dann nimmt, bzw umzusehen wie viele Rows er denn hat nicht das es zwischen drin zu einem ungewollten warum auch immer PostBack kommt.

    Du kannst auch mal versuchen die Deklaration von row as GridViewRow außerhalb der Schleife zu machen.


    Das ist jetzt halt bisschen suchen auf gut Glück, weil ich sehe selbst irgendwie grad keinen Fehler in der ganzen Sache.
    Hab einfach die Vermutung das er den Inhalt des Gridviews zwischen drin verliert warum auch immer...
    Und das Gridview besitzt zu diesem Zeitpunkt auch noch wirklich Datensätze??
    Kannst du die Summe und den Vergleich nicht eventuell schon im SQL-Statement lösen? Das würde dir die beiden Schleifen sparen und das Problem wäre "gelöst"

    Wenn ich die Schleife aber ausserhalb der anderen Schleifen und der Bedingungen setze, nimmt er sie sehr wohl an.

    Welche Bedingungen meinst du hier? Die IFs innerhalb der Schleife oder die anderen zwei Schleifen als Bedingung?

    icemanns schrieb:

    Und das Gridview besitzt zu diesem Zeitpunkt auch noch wirklich Datensätze??

    Zu diesem Zeitpunkt noch nicht. Das SQL Statement wird erst danach aufgerufen:

    Visual Basic-Quellcode

    1. SqlDataSource1.SelectCommand = "SELECT [ArtikelName], [ArtikelPreis] FROM [TblArtikel] WHERE ([ArtikelID] = "
    2. For i As Integer = 0 To (art.Length - 2)
    3. SqlDataSource1.SelectCommand &= art(i)
    4. SqlDataSource1.SelectCommand &= ") or ([ArtikelID] = "
    5. Next
    6. SqlDataSource1.SelectCommand &= "'')"


    Wenn ich die SQL Befehle aber schon vor den oberen Schleifen setze, bekomme ich für jede Zeile das selbe Ergebnis.

    icemanns schrieb:


    Kannst du die Summe und den Vergleich nicht eventuell schon im SQL-Statement lösen? Das würde dir die beiden Schleifen sparen und das Problem wäre "gelöst"

    Soweit reichen meine Kenntnisse leider nicht. Wie mach ich das?



    icemanns schrieb:


    "Wenn ich die Schleife aber ausserhalb der anderen Schleifen und der Bedingungen setze, nimmt er sie sehr wohl an."Welche Bedingungen meinst du hier? Die IFs innerhalb der Schleife oder die anderen zwei Schleifen als Bedingung?


    Diese hier: For Each row As GridViewRow In GridView1.Rows
    Sorry, aber wie willst du das Gridview durchlaufen, wenn noch gar keine Werte enthalten sind?!

    Um dir ein eventuell passendes SQL-Statement zu liefern bräuchte ich ein paar mehr Infos über die Tabelle und woraus du die Summe berechnen möchtest

    icemanns schrieb:

    Sorry, aber wie willst du das Gridview durchlaufen, wenn noch gar keine Werte enthalten sind?!

    Das macht natürlich Sinn. Den Code habe ich mir nun gefühlte 98746 mal angesehen aber das fällt mir natürlich nicht auf :cursing:


    icemanns schrieb:


    Um dir ein eventuell passendes SQL-Statement zu liefern bräuchte ich ein paar mehr Infos über die Tabelle und woraus du die Summe berechnen möchtest
    Also eigentlich will ich nur dass in meinem GridView alle Artikel angezeigt werden sollen dir ich zuvor in einem anderen GridView ausgewählt habe. Das schaffe ich mit eben diesem Schnippsel:

    Visual Basic-Quellcode

    1. SqlDataSource1.SelectCommand = "SELECT [ArtikelName], [ArtikelPreis] FROM [TblArtikel] WHERE ([ArtikelID] = "
    2. For i As Integer = 0 To (art.Length - 2)
    3. SqlDataSource1.SelectCommand &= art(i)
    4. SqlDataSource1.SelectCommand &= ") or ([ArtikelID] = "
    5. Next
    6. SqlDataSource1.SelectCommand &= "'')"

    Da man aber Ein und die Selbe ID mehrmals auswählen kann, ist das GridView natürlich unvollständig.Die Tebelle sieht in etwa so aus:
    • ArtikelID = integer --> not null
    • ArtikelName = nvarchar(50)
    • ArtikelBeschreibung = nvarchar(max)
    • ArtikelPreis = numeric(18,2)
    Ich würde das Statement wie folgt aufbauen:

    SQL-Abfrage

    1. SELECT [ArtieklName], [ArtikelPreis] FROM [TblArtikel] WHERE [ArtikelID] IN (hier die ganze ID's) and [ArtikelID] = ''


    Ein Beispiel für IN findest du hier:
    w3schools.com/sql/sql_in.asp

    Du kannst ja den IN Teil vorher mit einem StringBuilder zusammensetzen und dann nur noch dort einsetzen.


    Wie ist das gemeint?

    Wenn ich die SQL Befehle aber schon vor den oberen Schleifen setze, bekomme ich für jede Zeile das selbe Ergebnis.


    Meinst du hier bei der Summe oder steht in jeder Zeile der gleiche Artikel?
    So, habe nun mein "where"-Statement entsprechend geändert. Danke für den Tipp! Kann ich sicher auch noch wo anders einsetzen.



    icemanns schrieb:


    Wie ist das gemeint?
    "Wenn ich die SQL Befehle aber schon vor den oberen Schleifen setze, bekomme ich für jede Zeile das selbe Ergebnis."
    Meinst du hier bei der Summe oder steht in jeder Zeile der gleiche Artikel?

    Immer die gleiche Menge. Also jeder Artikel hätte dann in der Ansicht die gleiche Stückzahl. Das ist allerdings nun eh logisch da er ja einfach jede Zeile befüllt obwohl das SQL Statement noch nicht aufgerufen wurde.















    Ich habe nun alles entsprechend geändert habe aber nun das Problem dass er mir einfach nurnoch Zählt. Ich hänge mal einen Screenshot dazu.
    Bilder
    • bestellung_p_sc1.png

      48,26 kB, 1.280×1.024, 129 mal angesehen

    icemanns schrieb:

    Das Problem bekommen wir sicher auch noch in den Griff ;)

    Woher holst du dir die Menge der Artikel ursprünglich liegt die auch in der Datenbank?

    Die Menge bekomme je in dem ich einfach den Artikel auswähle. Wähle ich ihn einmal aus, steht er einmal im Session-String. Gehe ich zurück und wähle den gleichen Artikel wieder steht er da ein zweites mal drin. Und so weiter.
    Warum legst du nicht eine weitere Tabelle in der Datenbank an z.B. Tabelle "bestellung" und speicherst hier deine einzelnen Bestellungen.
    So hast du diese auch auf längere Sicht griff bereit, falls mal Fragen auftauchen sollten oder so..

    Würde mir das so vorstellen:

    - Tabelle "Artikel" enthält alle vorhanden Artikel/Produkte
    (ArtID, ArtBezeichnung, ArtPreis,...)
    - Tabelle "Bestellung" enthält die jeweilig getätigte Bestellung
    (BestID, ArtID, Menge)
    Hier wäre es ein kompinierter PK aus BestID und ArtID

    Hierdurch musst du noch die Tabelle "Bestellung" abfragen, wenn du dein Gridview befüllen willst.

    Falls dir das nicht gefällt scheinst du noch ein Problem, bei der Auswertung der Session zu haben bzw. der Zählung der in der Session gespeicherten Werte.

    icemanns schrieb:

    Warum legst du nicht eine weitere Tabelle in der Datenbank an z.B. Tabelle "bestellung" und speicherst hier deine einzelnen Bestellungen.

    So hast du diese auch auf längere Sicht griff bereit, falls mal Fragen auftauchen sollten oder so..



    Würde mir das so vorstellen:



    - Tabelle "Artikel" enthält alle vorhanden Artikel/Produkte

    (ArtID, ArtBezeichnung, ArtPreis,...)

    - Tabelle "Bestellung" enthält die jeweilig getätigte Bestellung

    (BestID, ArtID, Menge)

    Hier wäre es ein kompinierter PK aus BestID und ArtID



    Exakt so sieht es zur Zeit aus. Allerdings will ich die Bestelldatenbank erst dann Befüllen wenn der Kunde alles ausgewählt hat und vor allem auch sieht was er ausgewählt hat.







    Noch leichter (und schöner) wäre es nur wenn der Kunde schon bei der Produktübersicht eine Menge angeben könnte. Das hatte ich auch schon einmal eingebaut aber ich weiß leider nicht wie ich den übergebenen String dann wieder ordentlich teilen kann. Angenommen mein String würde mit der Bestellmenge so aussehen:

    Quellcode

    1. 27x2;16x1;2x7
    (ich hätte also Produkt 27 zwei mal ausgewählt, Produkt 16 einmal und Produkt 2 sieben mal)
    Nun müsste ich aber zwei Array befüllen bei dem das eine Array mit den ID's befüllt wird und das andere Array mit der Menge. Auch ein Zweidimensionales Array würde ich mir einreden lassen aber auch da weiß ich nicht wie ich die Daten vom String in das Array bekomme.
    Du kannst auch das Dictonary benutzen und dieses an die Session übergeben und anschließend auswerten.

    Dictonary MSDN:
    msdn.microsoft.com/de-de/library/xfhwa508(v=vs.80).aspx

    Wenn du das ganze in zwei Arrays trennst kann es evtl. zu Verschiebung der Mengen/Artikel zu Ordnung kommen. ;)

    Bei einem zwei Dimensionalen Array würde das ganze einfach so aussehen

    Array 1. Ebene = ArtikelID
    Array 2. Ebene = Menge

    Der Zugriff darauf wäre dann
    Array(0)(0) für ArtikelID und
    Array(0)(1) für die Menge des jeweiligen Artikels

    Die Zuweisung erfolgt genauso:

    Array(0)(0) = ArtikelID
    Array(0)(1) = Menge


    Meine Empfehlung läuft aber auf das Dictonary hinaus!

    icemanns schrieb:

    Du kannst auch das Dictonary benutzen und dieses an die Session übergeben und anschließend auswerten.



    Dictonary MSDN:
    msdn.microsoft.com/de-de/library/xfhwa508(v=vs.80).aspx




    Wenn du das ganze in zwei Arrays trennst kann es evtl. zu Verschiebung der Mengen/Artikel zu Ordnung kommen. ;)



    Bei einem zwei Dimensionalen Array würde das ganze einfach so aussehen

    Array 1. Ebene = ArtikelID

    Array 2. Ebene = Menge



    Der Zugriff darauf wäre dann

    Array(0)(0) für ArtikelID und

    Array(0)(1) für die Menge des jeweiligen Artikels



    Die Zuweisung erfolgt genauso:



    Array(0)(0) = ArtikelID

    Array(0)(1) = Menge


    Meine Empfehlung läuft aber auf das Dictonary hinaus!




    Das Dictionary scheint eh eine Art Zweidimentionales Array zu sein. Zumindest was ich bis jetzt so sehe. Aber wenn das Dictionary für diesen Zweck besser ist verwende ich auch gerne das. Nur leider weiß ich nicht wie es es mit meine String befüllen soll.

    Ich Splite ja meinen String zur Zeit so:

    Visual Basic-Quellcode

    1. art = best_step2.Split(";")


    Aber dann hätte ich ja, wenn ich die Menge auch mit eintrage in den String, folgendes in meinem (in diesem Fall) Array stehen:

    zB.

    Array1(0): 27x2

    Array1(1): 16x1

    Array1(2): 2x7
    Allerdings brauch ich die Menge ja Extra. Also wenn ich das recht verstanden habe wäre der Key dann die ID (zB: 27) und der Wert dann die Menge (zB: 2). Ich weiß aber leider absolut nicht wie ich aus meine String das alles in mein Dictionary bekommen soll.
    Du musst das schon passend in dem Array speichern, wenn der User die Auswahl trifft von der Menge.

    Also

    Array(0)(0) = 27
    Array(0)(1) = 2
    Array(1)(0) = 16
    Array(1)(1) = 1

    Du kannst das komplette Array an die Session übergeben, da die Sessions es als Object entgegen nehmen und auch so wieder zurückgegeben!

    Lass mal den Teil sehen, bei dem du die Menge usw. entgegen nimmst bzw. auswählen lässt.