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查詢字符串一起刪除

相關問題