1

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

+0

Это один из способов решить эту проблему динамической прикрепленных событий. есть и другие, вам нужно понять жизненный цикл страницы, чтобы заставить этот материал работать, google 'asp.net page life cycle', чтобы узнать больше или прочитать http://stackoverflow.com/questions/141169/c-dynamically-created- linkbutton-command-event-handler – Hogan

ответ

1

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

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

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

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

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

+0

Хм, так что в основном выше всех операторов if в методе Page_Init, чтобы инициализировать таблицу? Как насчет кнопки ссылки, видя, как все они динамически генерируются для каждой строки? – Chris

+0

@ Крис, обновленный ответ. –

+0

Приветствие buddy, в случае пользователя, обращающегося к странице без строки запроса, не будет ошибкой страницы, хотя, поскольку мой код ссылается на строку запроса? Хотя, я думаю, я мог бы заключить его в try/catch, но в итоге я попаду в ту же ситуацию, если так? – Chris

0

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