Laden...

GridView RowIndex falsch

Erstellt von Chris06 vor 17 Jahren Letzter Beitrag vor 14 Jahren 1.931 Views
C
Chris06 Themenstarter:in
130 Beiträge seit 2006
vor 17 Jahren
GridView RowIndex falsch

Hi Leute,

ich werd noch völlig bekloppt.

Also zu Anfangs habe ich ein GridView mit Daten und einem Delete Button.
Der Button ist mit dem Event Row_Deleting verbunden:

protected void GridViewrel_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
            string probid = Session["probid"].ToString();

            string versionid = GridViewrel.Rows[e.RowIndex].Cells[3].Text; ;
            AddRelation rel = new AddRelation(versionid, probid);
            rel.Problem2Product();

            bestehende_Verknüpfungen_zu_ADC(probid);
    }

wie man sieht hatte ich die ID, die ich für die Datenbank benötige, einfach im Grid mit ausgegeben. Jetzt suche ich nach einer Lösung, wie ich das anzeigen der ID umgehen kann. Am einfachsten wäre es, im Grid die spalte einfach invisible zu schalten. Blöderweise kann ich dann auch nicht mehr auf die ID zugreifen. (Ich finde das sollte Microsoft wirklich mal ändern)

Naja egal, ich habe im Netz einen kleinen Trick entdeckt.
Und zwar nehme ich die ID und übergebe sie in jeder Reihe dem Delete Button als command argument.

Das mit dem übergeben funktioniert auch noch, und zwar in dem Event RowDataBound.

 protected void GridViewrel_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType.ToString() == "DataRow")
        {

            LinkButton lbtEdit = (LinkButton)e.Row.Cells[0].Controls[0];
            lbtEdit.CommandArgument =
               ((DataRowView)e.Row.DataItem)["Version_ID"].ToString();
        }

    }

protected void GridViewrel_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
            string probid = Session["probid"].ToString();

            LinkButton lkBtn = (LinkButton) GridViewrel.Rows[e.RowIndex].Cells[0].Controls[0];
            string versionid =  lkBtn.CommandArgument;
            AddRelation rel = new AddRelation(versionid, probid);
            rel.Problem2Product();

            bestehende_Verknüpfungen_zu_ADC(probid);
    }

Das Problem ist jetzt, dass mir beim löschen e sehr komische RowIndexe ausspuckt. Nämlich welche die es gar nicht gibt. Der kommt z.b. auf 4 obwohl nur 2 Reihen existieren. Oder einmal stand sogar eine 35 drinn, die eigentlich die ID war. Was mir beim testen auffiel ist, dass die DataBound Funktion sehr sehr oft aufgerufen wird. Für jede Reihe mehrfach. Und wenn ich dann noch auf delete klicke, wird vor der delete funktion auch erst nochmal die databound aufgerufen.
Mein Verdacht ist, das die DataBound mein Grid irgendwie kaputt macht.

Ich habe echt keine Ahnung was ich da noch machen soll??
Das ist alles sehr mysteriös.

VG
Chris06

181 Beiträge seit 2006
vor 17 Jahren

boah hab ich da mal ewig gesucht und nur ein Workarround gefunden der wirklich funktioniert.

ich kenn zwar dein Gridview nicht aber ich behaupte wenn du allow paging = true setzt geht es

mfg Polo

C
Chris06 Themenstarter:in
130 Beiträge seit 2006
vor 17 Jahren

wie hast du es denn damals gemacht??

also mit allow paging hat das überhaupt nichts zutun.
Hab´s ausprobiert.
Immer noch selbes Problem.

Was ich jetzt entdeckt hat ist, das der RowIndex irgendwie hochgezählt wird.

ich habe auf den ersten eintrag geklickt, mit der ID 1 und Index 0

gelöscht wurde aber der eintrag an stelle Index 1,

nach dem 2. wieder auf Index 0, löschte er Index 2

dann 3, usw.

Ich habe das Gefühl, dass er wirklich die ID auf den Index drauf rechnet.
Allerdings steht sowas eigentlich nicht im Code.

???

C
Chris06 Themenstarter:in
130 Beiträge seit 2006
vor 17 Jahren

Ich habe die Delete Button automatisch erstellen lassen.

Und habe jetzt festgestellt, das das Control wohl automatisch auch mit dem command argument arbeitet. Es schreibt den RowIndex in das command argument und greift dann beim löschen auch auf dieses command argument zu und benutzt ihn als rowindex.

Da ich den Wert überschrieben habe, kam der Fehler.

Also kann ich das so wohl nicht machen...

Wie oder wo kann ich meine ID unsichtbar speichern??

181 Beiträge seit 2006
vor 17 Jahren

ich weiss dass das eigentlich nichts mit allow paging zu tun hat, aber ich hab allow paging true gesetzt dann gings. Hast du dein Gridview so definiert?

  <asp:GridView ID="gridUsers" runat="server" AutoGenerateColumns="false" DataSourceID="dsUsers"
    DataKeyNames="Number" AllowPaging="true" PageSize ="100" >

sonst zeig das doch bitte mal

bei mir war es exakt dein Problem und nach dem hinzufügen von
AllowPaging="true" PageSize ="100"
ging es dann

C
Chris06 Themenstarter:in
130 Beiträge seit 2006
vor 17 Jahren

Hi,

ich habe jetzt eine Lösung gefunden.

Auch wenn das vielleicht etwas umständlich ist.
Und zwar benutze ich jetzt nebenher eine sorted List,
inder ich die ID ablege. Key ist der rowindex.

Im Databound wird die Liste gefüllt,
und im Datadelete dann gelesen und entfernt.

@polofreak

Mein Grid sah ähnlich aus, nur habe ich keine Datasource.
Das könnte den Unterschied ausmachen, da ich die Daten erst zur Laufzeit binde.

181 Beiträge seit 2006
vor 17 Jahren

ich binde die Daten auch erst zur Laufzeit.

  <alc:myDataSource ID="dsUsers" runat="server" SelectCommand="exec uspSelUsers"
    UpdateCommand="exec uspUpdUsers @FirstName, @LastName, @EmailAdress, @DefaultLanguage, @DefaultFamily, @DefaultSite, @GroupNo, @SuperUser, @Remark, @Number"
    DeleteCommand="exec uspDelUser @Number">
  </alc:myDataSource>
G
26 Beiträge seit 2009
vor 14 Jahren

Hallo,

ich habe eine Frage zum GridView.RowDeleting-Ereignis. Ich habe mir auch schon die Hilfe angesehen.

]ich möchte mit dem GridView.RowDeleting-Ereignis eine Meldung ausgeben ob der Ausgewälte Datensatz wirklich gelöscht werden soll. Wenn ich beim Gridview auf löschen drücke ist der Datensatz ohne eine Abfrage weg.

Meine Frage ist: Welche if-Bedingung kann ich verwenden?

den Code unten habe ich versucht anzupassen an das Beispiel:

asp:GridView ID="GridView1" runat="server" AllowPaging="True"
        autogeneratecolumns="true"
        autogeneratedeletebutton="true"
        onrowdeleting="GridView1_RowDeleting" 
        AllowSorting="True" CellPadding="4" 
        DataKeyNames="Id" DataSourceID="SqlDataSource1" ForeColor="#333333"
        GridLines="None" Width="679px">
        <RowStyle BackColor="#EFF3FB" />
G
26 Beiträge seit 2009
vor 14 Jahren

Hallo Ich habe es nun so weit hin bekommen das ich ein Label ausgegeben bekomme ob ich wirklich löschen möchte.

der Code sieht dann erweitert so aus:

<script runat="server">
        void GridView1_RowDeleting(Object sender, GridViewDeleteEventArgs e)
        {
            if (GridView1.SelectedIndex == GridView1.EditIndex)
            {
                e.Cancel = true;
                Message.Text = " Wollen Sie wirklich löschen?";
            }
        }         
  </script>

und so:

<asp:label id="Message"
        forecolor="Red"          
        runat="server"/>

jetzt habe ich immer noch zwei Probleme:

  1. Problem
    Ich habe nur ein Label das mir eine meldung ausgibt. aber davon ist der datensatz noch nicht gelöscht. Ich brauche noch eine Box die mir die Frage stellt wirklich löschen oder nicht löschen.

  2. Problem
    Wenn ich die in dem Gridview auf Auswahl drücke und dann auf Löschen ist der datensatz auch ohne Meldung verschwunden.