Frage

Ich habe dies vor gefragt, aber leider bin ich immer noch Probleme hat und das Problem wurde nicht gelöst. Grundsätzlich ist ich dynamisch eine Linkbutton für jede Zeile von der Erstellung einer Tabelle mir zu erzeugen und diese Taste hat die Aufgabe, die Zeile mit der entsprechenden ID aus der Datenbank zu löschen. Um dies zu tun, muss ich scheinbar die Linkbutton einen Befehl zuweisen, damit es in dem Fall gehen werde, wenn es angeklickt wird. Das Problem ist, wenn die Schaltfläche geklickt hat, das Programm nie geht in den Befehl - ich habe setzen Haltepunkte drin und es geht nie in sie. Hier ist mein Code:

protected void Page_Init(object sender, EventArgs e)
        {
            if (Request.QueryString["id"] != null)
            {

                ColorConverter conv = new ColorConverter();
                string connection = ConfigurationManager.ConnectionStrings["TPRTestConnectionString"].ConnectionString;
                TPRDBDataContext dc = new TPRDBDataContext();
                DataContext db = new DataContext(connection);
                Table<SageAccount> SageAccount = db.GetTable<SageAccount>();
                Table<InvoiceItem> InvoiceItem = db.GetTable<InvoiceItem>();
                Table<Invoice> Invoice = db.GetTable<Invoice>();
                Boolean alloweditting = (from s in dc.Invoices where s.id.ToString() == Request.QueryString["id"] select s.alloweditting).Single();
                if (alloweditting == false)
                {
                    dtlsInsert.Visible = false;
                    modalPanel.Visible = false;
                }
                int sagepk = (from s in dc.Invoices where s.id.ToString() == Request.QueryString["id"] select s.sageaccount).Single();
                lblSageID.Text = (from s in dc.SageAccounts where s.ID == sagepk select s.SageID).Single();
                lblDate.Text = DateTime.Now.ToShortDateString();


                Table table = new Table();
                table.Width = Unit.Percentage(100);
                table.GridLines = (GridLines)3;

                TableHeaderRow header = new TableHeaderRow();
                header.BackColor = (System.Drawing.Color)conv.ConvertFromString("#EDEDED");
                foreach (string header2 in new string[] { "", "Quantity", "Rate", "Description", "Nominal Code", "Subtotal" })
                {
                    TableCell cell = new TableCell();
                    cell.Text = header2;
                    header.Cells.Add(cell);
                }

                table.Rows.Add(header);

                var data = (from s in dc.InvoiceItems where s.invoiceid.ToString() == Request.QueryString["id"].ToString() select s);
                foreach (var x in data)
                {

                    TableRow row = new TableRow();
                    if (x.invoicetext == null)
                    {
                        decimal total;
                        try
                        {
                            total = (decimal)x.rate * (decimal)x.quantity;
                        }
                        catch
                        {
                            total = 0;
                        }
                        int i = 0;
                        foreach (string columnData in new string[] { x.id.ToString(), x.quantity.ToString(), x.rate.ToString(), x.description, x.nominalcode, total.ToString("N2") })
                        {
                            TableCell cell = new TableCell();
                            {
                                if (i == 0)
                                {
                                    LinkButton lnkdel = new LinkButton();
                                    lnkdel.Text = "Delete";
                                    lnkdel.ID = "lnkDel" + Guid.NewGuid();

                                    if (alloweditting == false)
                                    {
                                        lnkdel.Enabled = false;
                                    }
                                    lnkdel.Font.Bold = false;
                                    lnkdel.CommandArgument = x.id.ToString();
                                    //lnkdel.Command += lnkdel_Command;
                                    //lnkdel.Command += new CommandEventHandler(this.lnkdel);
                                    cell.Controls.Add(lnkdel);
                                    i++;
                                }
                                else
                                {
                                    cell.Text = columnData;
                                }


                            }

                            row.Cells.Add(cell);
                        }



                        runningtotal = runningtotal + total;

                    }
                    else
                    {
                        int i = 0;

                        foreach (string columnData in new string[] { x.id.ToString(), x.invoicetext })
                        {
                            TableCell cell = new TableCell();

                            if (i == 0)
                            {
                                LinkButton lnkdel = new LinkButton();
                                lnkdel.Text = "Delete";
                                lnkdel.ID = "lnkDel" + Guid.NewGuid();

                                if (alloweditting == false)
                                {
                                    lnkdel.Enabled = false;
                                }
                                lnkdel.Font.Bold = false;
                                          //lnkdel.Command += lnkdel_Command;
                                    //lnkdel.Command += new CommandEventHandler(this.lnkdel);
                                lnkdel.CommandArgument = x.id.ToString();



                                cell.Controls.Add(lnkdel);
                                i++;
                            }
                            else
                            {
                                cell.Text = columnData;
                                cell.ColumnSpan = 5;
                            }
                            row.Cells.Add(cell);

                        }

                    }

                    switch (x.formatoptions)
                    {
                        case 1:
                            row.ForeColor = (System.Drawing.Color)conv.ConvertFromString("black");
                            row.Font.Bold = false;
                            break;
                        case 2:
                            row.ForeColor = (System.Drawing.Color)conv.ConvertFromString("black");
                            row.Font.Bold = true;
                            break;
                        case 3:
                            row.ForeColor = (System.Drawing.Color)conv.ConvertFromString("red");
                            row.Font.Bold = false;
                            break;
                        case 4:
                            row.ForeColor = (System.Drawing.Color)conv.ConvertFromString("red");
                            row.Font.Bold = true;
                            break;
                    }
                    table.Rows.Add(row);
                }

                TableFooterRow row2 = new TableFooterRow();
                TableCell cell2 = new TableCell();
                cell2.Text = "<span style\"text-align: right; width: 100%;\">Total = <b>" + runningtotal.ToString("N2") + "</b></span>";
                cell2.ColumnSpan = 6;
                row2.Cells.Add(cell2);
                table.Rows.Add(row2);

                var update = (from s in dc.Invoices where s.id.ToString() == Request.QueryString["id"] select s).Single();
                update.total = runningtotal;

                dc.SubmitChanges();
                datatable.Controls.Clear();
                datatable.Controls.Add(table);
            }
            else
            {
                Response.Redirect("Invoices.aspx");
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {



        }


        protected void lnkdel_Command(object sender, CommandEventArgs e)
        {
            string connection = ConfigurationManager.ConnectionStrings["TPRTestConnectionString"].ConnectionString;


            using (SqlConnection conn = new SqlConnection(connection))
            {
                SqlCommand comm = new SqlCommand("DELETE FROM InvoiceItem WHERE id = @id", conn);
                comm.Parameters.AddWithValue("@id", e.CommandArgument.ToString());
                conn.Open();
                try
                {
                    comm.ExecuteNonQuery();
                }
                catch (Exception ex)
                {
                    Response.Write(ex);
                }
            }
    }

Beachten Sie ich aus 2 der entscheidenden Linien haben kommentiert für Posting hier nur darauf hinweisen, dass ich beide Leitungen versucht haben, das ist auf Kommentar, und weder Arbeit: (

War es hilfreich?

Lösung

Sie müssen die Bedienelemente auf alle Postbacks hinzuzufügen. Sie erscheinen nur, um sie auf der ursprünglichen get Erstellung (die Query-String-Check). Auf der Post zurück, bekommen diese Kontrollen nie so ohne Ereignis ausgelöst werden neu erstellt.

Es ist notorisch kontraintuitiv, aber während ASP.NET beugt sich nach hinten über Sie denken, dass die Instanz Ihrer Seite-Klasse ist die gleiche zwischen zwei HTTP-Anfragen, die Realität ist, dass sie nicht die gleichen sind. Eine neue Instanz wird jedes Mal erstellt. Es sieht aus wie Sie die dynamisch generierte Kontrollen mehrmals versuchen zu vermeiden Zugabe - denken Sie nicht wollen, Duplikate. Die Realität ist, dass Sie nie Duplikate erhalten, wenn sie in einem Lebenszyklus-Verfahren wie OnInit() dynamisch generierten Steuerelemente hinzugefügt, da es immer eine neue Instanz der Seitenklasse, und damit diese dynamisch generierten Steuerelemente sind verschwunden.

Der Grund, dies für Entwickler in der Regel transparent ist, ist, dass alle Steuerelemente im Code-Front sind automatisch neu generiert für Sie sowohl auf dem ursprünglichen Antrag und jede einzelne Post zurück. Für Ihre dynamisch erstellten Steuerelemente, passieren Sie diese Zeile haben:

if (Request.QueryString["id"] != null) { ... }

Wenn Sie etwas Besonderes tun, dass Attribut „id“ wird nicht auf dem Postbacks in dem Query-String sein. Dies bedeutet, dass keines des Code in dem if Block wird auf der Post wieder ausgeführt werden (wenn Ihr Ereignis tatsächlich ausgelöst wird.) Das bedeutet, dass Ihr if-Check an der Spitze sollte vollständig entfernt werden. Alle , dass Code sollte für jede Anfrage (GET und POST) ausgeführt werden.

Andere Tipps

Nur zu sagen, ich habe eine Abhilfe geschaffen - einfach einen einfachen Link auf der Seite zu schaffen, zusammen mit einer Abfragezeichenfolge der ID der Zeile mit

löschen
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top