Динамическое воссоздание элементов управления при обратной передаче для каждой строки таблицы (ASP.NET/C#) - PullRequest
1 голос
/ 01 ноября 2010

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

Проблема в том, что сейчас, когда я нажимаю Удалить, страница отправляется обратно без изменений, но мне сказали, что мне нужно заново создать элементы управления - но как мне восстановить их в 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);
        }

Ответы [ 2 ]

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

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

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

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

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

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

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

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