2010-11-01 2 views
1

Для каждой строки в моей «таблице», которую я создаю вручную, должен быть LinkButton для удаления строки базы данных, которая соответствует столбцу в таблице , Поскольку никакие 2 элемента управления не могут иметь одно и то же имя, мне пришлось использовать GUID, чтобы назвать их, чтобы они были уникальными.Динамически воссоздающие элементы управления при обратной передаче для каждой строки таблицы (ASP.NET/C#)

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

Table table = new Table(); 
      table.GridLines = GridLines.None; 
      //table.BorderWidth = 1; 
      //table.BorderColor = (System.Drawing.Color)conv.ConvertFromString("black"); 
      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 += (s, e2) => 
           { 
            using (SqlConnection conn = new SqlConnection(connection)) 
            { 
             SqlCommand comm = new SqlCommand("DELETE FROM InvoiceItem WHERE id = @id", conn); 
             comm.Parameters.AddWithValue("@id", e2.CommandArgument); 
             conn.Open(); 
             try 
             { 
              comm.ExecuteNonQuery(); 
             } 
             catch (Exception ex) 
             { 
              Response.Write(ex); 
             } 
            } 
           }; 

           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.CommandArgument = x.id.ToString(); 
           rowid = lnkdel.CommandArgument; 
           lnkdel.Command += (s, e2) => 
           { 
            using (SqlConnection conn = new SqlConnection(connection)) 
            { 
             SqlCommand comm = new SqlCommand("DELETE FROM InvoiceItem WHERE id = @id", conn); 
             comm.Parameters.AddWithValue("@id", rowid); 
             conn.Open(); 
             try 
             { 
              comm.ExecuteNonQuery(); 
             } 
             catch (Exception ex) 
             { 
              Response.Write(ex); 
             } 
            } 
           }; 

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

ответ

0

Не используйте GUID. Сделайте значение ID из rowid, поэтому это повторяемое значение, например «row_784».

Например, вместо

lnkdel.ID = "lnkDel" + Guid.NewGuid(); 

использование

lnkdel.ID = "lnkDel" + x.id.ToString(); 
+0

Если бы я сделал это, какие части моего кода нужно было бы воссоздать и как? – Chris

0

Вам нужно создать их в Page_Init, не Page_Load. Вам нужно только перевести вызов на код, который создает таблицу в Page_Init, и все должно работать так, как вы ожидаете.

+1

Какие утверждения мне нужно ввести в метод Page_init? Я положил бит таблицы Table table = new Table(), но тогда, когда я использую таблицу в другом месте, я не позволяю мне обращаться к «таблице». И если я оставлю там оригинал и скопирую, у меня все равно будет такая же проблема – Chris

Смежные вопросы