Динамически создаваемая LinkButton не перейдет в командное событие - PullRequest
1 голос
/ 04 ноября 2010

Я спрашивал об этом раньше, но, к сожалению, у меня все еще есть проблемы, и проблема не была решена.По сути, я динамически создаю 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 из важнейших строк для публикации здесь, просто чтобы указать, что я пробовал обе закомментированные строки, и ни одна из них не работает :(

Ответы [ 2 ]

1 голос
/ 04 ноября 2010

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

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

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

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

Если вы не делаете что-то особенное, этот атрибут "id" не будет в строке запроса при обратной передаче.Это означает, что ни один из кодов в блоке if не будет выполняться на обратной стороне (когда ваше событие действительно срабатывает). Это означает, что ваша проверка if вверху должна быть полностью удалена. Все этот код должен выполняться для каждого запроса (GET и POST).

0 голосов
/ 04 ноября 2010

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

...