1

以前に質問したことがありますが、残念ながらまだ問題があり、問題は解決しませんでした。基本的に、生成しているテーブルの行ごとにLinkBut​​tonを動的に作成しており、そのボタンには、データベースから対応するIDを持つ行を削除するタスクがあります。これを行うには、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行をコメントアウトしたことに注意してください。コメントアウトされた両方の行を試したが、どちらも機能しないことを指摘するだけです:(

4

2 に答える 2

1

すべてのポストバックにコントロールを追加する必要があります。最初のget(クエリ文字列チェック)でのみ作成しているように見えます。ポストバックでは、これらのコントロールが再作成されることはないため、イベントは発生しません。

直感に反することで有名ですが、ASP.NETは逆方向に曲がって、ページクラスのインスタンスが2つのHTTPリクエスト間で同じであると思わせる一方で、実際には同じではありません。毎回新しいインスタンスが作成されます。動的に生成されたコントロールを複数回追加することを避けようとしているようです。重複したくないと考えています。現実には、ライフサイクルメソッドに動的に生成されたコントロールを追加するときに重複が発生することはありません。たとえば、動的に生成されたコントロールは常にOnInit()ページクラスの新しいインスタンスであるため、これらの動的に生成されたコントロールはなくなります。

これが通常開発者に透過的である理由は、コードフロントのすべてのコントロールが、最初のリクエストとすべてのポストバックの両方で自動的に再生成されるためです。動的に作成されたコントロールの場合、次の行があります。

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

特別なことをしているのでない限り、その「id」属性はポストバックのクエリ文字列には含まれません。これは、ifブロック内のコードがポストバックで実行されないことを意味します(イベントが実際に発生したとき)。これはif、上部の-checkを完全に削除する必要があることを意味します。 そのすべてのコードは、すべてのリクエスト(GETおよびPOST)に対して実行する必要があります。

于 2010-11-03T21:22:35.380 に答える
0

回避策を作成したと言っただけです。ページへの単純なリンクと、削除する行のIDを含むクエリ文字列を作成するだけです。

于 2010-11-04T19:52:54.163 に答える