سؤال

لقد سألت هذا من قبل ، لكن للأسف ما زلت أواجه مشاكل ولم يتم حل المشكلة. في الأساس ، أقوم بإنشاء LinkButton ديناميكيًا لكل صف من الجدول الذي أقوم بإنشائه ، وهذا الزر لديه مهمة حذف الصف مع المعرف المقابل من قاعدة البيانات. للقيام بذلك ، يبدو أنني بحاجة إلى تعيين أمر LinkButton حتى يذهب إلى الحدث عند النقر عليه. المشكلة هي أنه عندما ينقر الزر على البرنامج أبداً يذهب إلى الأمر - لقد وضعت نقاط التوقف هناك ولا تذهب إليها أبدًا. هذا هو الكود الخاص بي:

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 من الخطوط الحاسمة للنشر هنا ، فقط للإشارة إلى أنني جربت كل من السطور التي تم التعليق عليها ، ولا تعمل :(

هل كانت مفيدة؟

المحلول

تحتاج إلى إضافة عناصر التحكم كل Postback. يبدو أنك تقوم بإنشاءها فقط على GET الأولي (فحص سلسلة الاستعلام). على بعد الخلف ، لا يتم إعادة إنشاء عناصر التحكم هذه أبدًا ، لذا لا توجد حرائق أحداث.

إنه أمر غير بديهي بشكل سيء ، ولكن في حين أن ASP.NET ينحني للخلف لتجعلك تعتقد أن مثيل فئة صفحتك هو نفسه بين طلبين HTTP ، فإن الواقع هو أنهما ليسا متماثلين. يتم إنشاء مثيل جديد في كل مرة. يبدو أنك تحاول تجنب إضافة عناصر التحكم التي تم إنشاؤها ديناميكيًا عدة مرات - التفكير في أنك لا تريد التكرار. الحقيقة هي أنك ستفعل أبداً احصل على التكرارات عند إضافة عناصر تحكم تم إنشاؤها ديناميكيًا في طريقة دورة حياة مثل OnInit() نظرًا لأنه دائمًا ما يكون مثيلًا جديدًا لفئة الصفحة ، وبالتالي فقد اختفت عناصر التحكم التي تم إنشاؤها ديناميكيًا.

والسبب في ذلك عادة ما يكون ذلك شفافًا للمطورين هو أن جميع عناصر التحكم في الرمز المسبق يتم إعادة توليدها تلقائيًا لك في كل من الطلب الأولي وكل ما بعد الظهير. لعناصر التحكم التي تم إنشاؤها ديناميكيًا ، يكون لديك هذا الخط:

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

ما لم تكن تفعل شيئًا مميزًا ، فلن تكون سمة "ID" في سلسلة الاستعلام على Postback. هذا يعني أن أيا من الكود في if سيتم تشغيل الكتلة على المنشور (عندما يطلق الحدث الخاص بك بالفعل) if-يجب إزالة التحقق في الأعلى تمامًا. الجميع يجب أن يتم تشغيل هذا الرمز لكل طلب (احصل و بريد).

نصائح أخرى

فقط أقول أنني قمت بإنشاء حل بديل - ببساطة إنشاء رابط بسيط إلى الصفحة ، إلى جانب سلسلة استعلام تحتوي على معرف الصف لحذفه

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top