1

我以前问过这个,但遗憾的是我仍然有问题,并且问题没有解决。基本上,我为我生成的表的每一行动态创建一个LinkBut​​ton,并且该按钮的任务是从数据库中删除具有相应ID的行。为了做到这一点,我似乎需要为LinkBut​​ton分配一个命令,以便它在单击时进入事件。问题是,当按钮点击程序从来没有进入命令 - 我已经把断点放在那里,它永远不会进入它们。这里是我的代码:动态创建LinkBut​​ton不会进入命令事件

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

这是解决这个动态连接事件问题的一种方法。还有其他的,你必须了解页面生命周期,使这个东西工作,谷歌''asp.net页生命周期'学习更多或阅读http://stackoverflow.com/questions/141169/c-dynamically-created- linkbutton-command-event-handler – Hogan 2010-11-03 21:19:43

回答

1

您需要添加的控制每一个回发。你似乎在初始GET(即查询字符串检查)只创建它们。在帖子后面,这些控件永远不会重新所以没有事件触发。

它出了名的反直觉,但是当ASP.NET向后弯曲让你认为这个实例你的页面类在两个HTTP请求之间是相同的,但实际情况是它们不一样。每次创建一个新实例。它看起来像你试图避免多次添加动态生成的控件 - 认为你不想重复。实际情况是,您将从不在生命周期方法(如OnInit())中添加动态生成的控件时会得到重复,因为它始终是页面类的新实例,因此这些动态生成的控件已消失。

这对开发人员来说通常是透明的原因在于,代码前端中的所有控件都会在初始请求和每一个后期处理中为您自动重新生成。为了您的动态创建的控件,你碰巧有这样一行:

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

除非你正在做一些特别的东西,即“id”属性将不会在上回发的查询字符串。这意味着if块中的任何代码都不会在回发期间(当您的事件实际触发时)运行。这意味着您的if-top顶部的检查应完全删除。 全部代码应为每个请求运行(GET POST)。

+0

嗯,基本上在Page_Init方法中的所有if语句中,初始化表?链接按钮怎么样,因为它们都是为每一行动态生成的? – Chris 2010-11-03 21:30:36

+0

@Chris,更新了答案。 – 2010-11-03 21:43:29

+0

干杯伙伴,在用户访问页面时没有查询字符串,不会导致页面错误,尽管我的很多代码引用了查询字符串?虽然我想我可以将它装入一个try/catch中,但是如果是这样的话,我最终会处于完全相同的状态吗? – Chris 2010-11-03 22:08:39

0

只是说我已经创建了一个解决方法 - 简单地创建一个简单的链接页面,包含该行的ID查询字符串一起删除

相关问题