Announcement

Collapse
No announcement yet.

Sortieren eines Gridview abhängigkeit von einer Spalte in der Datenbank

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Sortieren eines Gridview abhängigkeit von einer Spalte in der Datenbank

    Hi leute, bräuchte mal eure Hilfe.

    ich würde gerne bieliebig Zeilen sortiere können in meinem Gridview wobei die Abhängigkeit der Sortierung aus der Datenbank komen soll, das sieht folegender massen aus




    In der Datenbank befindet sich eine Spalte in der die Reihenfolge verwaltet wird.




    Nehmen wir an man will die Gruppe AEC als drittes setzen, das heisst die vorrige 3 Gruppe durch die 2 ersetzt.

    Dazu muss ich ermitteln in welcher Zeile man sich grad befindet und wohin es verschoben werden soll anschliessend die verscheibung ausführen, die neue rankorders in die Tabelle schreiben und das ganze noch an das Gridview binden?

    Aber wie sage ich dem dass er die Gruppen anahnd der spalte aus der Datenbank sortieren soll?

  • #2
    Wenn ich richtig verstanden habe, hat deine Frage mit Sortierungsfunktion eines GridView nichts zu tun.

    Du möchtest bieim klick auf "v" den entsprechenden Datensatz ein Stückchen nach untenschieben, und beim klick auf "^" - nach oben.

    Also:

    1. skill_groupID müsste als DataKeyName in GridView definiert werden. (Siehe GridView eigenschaften)

    2. im Ereignis "klick" von Buttons "v" und "^" müsstest du DataKey "SkillGroupID" aus der selektierte Zeile definieren.

    3. Dieses Key als Parameters in die SQL gespeicherte Prozedure übergeben.
    Auserdfem je nach Button solltest du auch die Richtung als parameter übergeben. (nach oben oder nach unten)
    Die Procedure muss dann rank_order entsprechend tauschen.

    Die Procedure kann so aussehen:

    [HIGHLIGHT=sql]
    CREATE PROCEDURE sp_ChangeRankOrder

    @skill_group_id int
    , @richtung int -- sagen wir mal (-1) nach unten, +1 nach oben

    AS

    BEGIN

    -- get Rank order Obere Grenze

    DECLARE @iRankOrderMax int
    SET @iRankOrderMax = (Select max(rank_order ) as MaxRankOrder
    From TableSkillGroups)


    -- get OriginalOrder
    DECLARE @iOriginslOrder int
    SET @iOriginslOrder = (Select rank_order From TableSkillGroups
    where SkillGroupID = @skill_group_id)

    -- get TauschRankOrder
    DECLARE @iTauschOrder int
    SET @iTauschOrder = @iOriginslOrder + @richtung

    -- get TauschSkillID
    DECLARE @iTauschScillID int
    SET @iTauschSkillID = (Select skill_group_id From TableSkillGroups
    where rank_order =@iTauschOrder)

    BEGIN Transaction
    -- entweder alle oder keine

    BEGIN TRY

    -- nur wenn wir zwischen 0 und 8

    IF (
    ((@iOriginslOrder + @richtung) Between 0 and @iRankOrderMax +1)
    AND ((@iTauschOrder - @richtung ) Between 0 and @iRankOrderMax +1)
    )

    BEGIN

    -- schieben originelle Datensatz
    UPDATE TableSkillGroups SET rank_order = @iOriginslOrder + @richtung
    Where skill_group_id = @skill_group_id

    -- schieben Tauschdatensatz
    UPDATE TableSkillGroups SET rank_order = @iTauschOrder - @richtung
    Where skill_group_id = @iTauschSkillID

    END

    END TRY
    CATCH BEGIN
    IF @@TRANCOUNT > 0 -- irgendwas hat nicht geklappt, setzten alles zurück
    ROLLBACK TRANSACTION;

    END CATCH
    IF @@TRANCOUNT > 0 -- alles ok , bestätigen wir die Transaktion
    Commit TRANSACTION;



    END


    GO
    [/HIGHLIGHT]


    4. GridView neu füllen.
    Dein GridView muss du anhang der rank_order füllen
    z.B. mit der Abfrage
    (Select * From TableSkillGroups ORder By rank_order)
    Zuletzt editiert von vadym voytas; 10.02.2010, 00:36.
    Bitte vergessen Sie nicht die Antwort zu bewerten. Danke.:-)

    Comment


    • #3
      Guten morgen vadym voytas, Ich habe mcih an deinem Sql Befehl gehalten und meine Sortierung serverseitig gemahct und in die Spalte Rank geschrieben.


      Code:
      protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
              {
                  if (e.CommandName == "Up")
                  {
                      int i = int.Parse((string)e.CommandArgument);
                      GroupAdapter.Update(Convert.ToInt32(GridView1.DataKeys[i - 1].Values[0].ToString()), i + 1);
                      GroupAdapter.Update(Convert.ToInt32(GridView1.DataKeys[i].Values[0].ToString()), i);
                      BindData();
                  }
                  else if (e.CommandName == "Down")
                  {
                      int i = int.Parse((string)e.CommandArgument);
                      GroupAdapter.Update(Convert.ToInt32(GridView1.DataKeys[i + 1].Values[0].ToString()), i);
                      GroupAdapter.Update(Convert.ToInt32(GridView1.DataKeys[i].Values[0].ToString()), i + 1);
                      BindData();
                  }

      Comment


      • #4
        Hallo,

        fällt dir auf, dass in beiden if-Zweigen fast dieselbe Arbeit ausgeführt wird? Und kann es eigentlich noch einen dritten Zweig geben?

        Alles, was sich wiederholt, sollte zusammengefasst werden, ähnlich wie es Vadym für die SP vorgeschlagen hatte.

        Gruß Jürgen

        Comment


        • #5
          Nicht direkt im zweiten IF sind andere Werte da vertausche bloss die Spalten ranks miteinander je nachdem was gedrückt wurde, wenn es den runter soll vertausche ich die Ranks

          Comment

          Working...
          X