Динамически созданная LinkButton не перейдет в командное событие

StackOverflow https://stackoverflow.com/questions/4091782

Вопрос

Я спросил этого раньше, но к сожалению, у меня все еще есть проблемы, и проблема не была решена. В принципе, я динамически создавая LinkButton для каждой строки таблицы, которую я генерирую, и эта кнопка имеет задачу удаления строки с соответствующим идентификатором из базы данных. Для этого я, казалось бы, должен назначить команду linkbutton, чтобы она перешла в событие, когда он нажал. Проблема в том, когда кнопка нажала программу никогда Идет в команду - я поместил точку останова, и это никогда не уходит в них. Вот мой код:

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);
                }
            }
    }

ПРИМЕЧАНИЕ Я прокомментировал 2 важных линий для размещения здесь, просто чтобы указать, что я пробовал обе линии, которые прокомментированы, и ни работают :(

Это было полезно?

Решение

Вам нужно добавить элементы управления на каждый Отсутствие. Вы, кажется, только создаете их на первоначальном получении (проверку строки запроса). На спине посту того, эти элементы управления никогда не воссозданы, так что нет событий.

Это как известно, противоречив к интуитивно понятно, но в то время как ASP.NET изгибается назад, чтобы подумать, что экземпляр вашего класса вашего страницы одинаково между двумя HTTP-запросами, реальность заключается в том, что они не одинаковы. Новый экземпляр создан каждый раз. Похоже, вы пытаетесь избежать добавления динамически генерируемых элементов управления несколько раз - думая, что вы не хотите дубликаты. Реальность такова, что вы будете никогда Получите дубликаты при добавлении динамически сгенерированных элементов управления в методе жизненного цикла, такого как OnInit() Поскольку это всегда новый экземпляр класса страницы, и, таким образом, эти динамически генерируемые элементы управления исчезли.

Причина, по которой это обычно прозрачно для разработчиков, состоит в том, что все элементы управления в кодовом фронте автоматически повторно генерируются для вас как на первоначальный запрос, так и на каждом оттенке. Для вашего динамически созданного элемента управления вы случайно у вас есть эта строка:

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

Если вы не делаете что-то особенное, атрибут «ID» не будет в строке запроса в обратке. Это означает, что ни один из кода в if блок будет запущен на спине поста (когда ваше мероприятие фактически пожалов.) Это означает, что ваш if-Не на вершине должен быть удален вообще. Все Этот код должен работать на каждый запрос (получить и СООБЩЕНИЕ).

Другие советы

Просто говоря, что я создал обходной путь - просто создавая простую ссылку на страницу вместе с строкой запроса, содержащей идентификатор строки, чтобы удалить

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top