【问题标题】:Postback Issues with OnClick EventsOnClick 事件的回发问题
【发布时间】:2013-12-19 05:34:56
【问题描述】:

但是,我有以下代码可以正常工作;当我单击删除按钮时,事件会触发,但更改未显示在 PostBack 上。这显然与 PostBack 管理有关。有人有什么建议吗?

   namespace WebApplication1
    {
        public partial class questiondetails : System.Web.UI.Page
       {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                LoadControls();
            }

        }

        void Edit_Click(object sender, ImageClickEventArgs e)
        {
            ImageButton editbut = sender as ImageButton;
            string cName = editbut.ID;
            string rID = cName.Remove(0, 5);

            Response.Write(Request.Form["entity_" + rID]);
            Response.Write(Request.Form["dollar_" + rID]);

        }

        void Delete_Click(object sender, ImageClickEventArgs e)
        {
            var delbut = (ImageButton)sender;
            string cName = delbut.ID;
            string rID = cName.Remove(0, 7);
            string MyParams = "@RowID=" + rID;

            iservices.DataAccessWebService WS = new iservices.DataAccessWebService();

            WS.ExecuteDatasetStoredProcedure(ConfigurationManager.AppSettings["SecurityDataAccess"], "iweb_sp_custom_coi_Question_Delete", MyParams.ToString());
            LoadControls();
            Response.Write("dome");
      }


        protected void LoadControls()
        {

            //Construct paramters from Querystring
            StringBuilder MyParams = new StringBuilder();
            MyParams.Append("@Term=2013,@ProjectCode=a12345,@ID=123,@CategoryCode=CONSULTANCIES");

            //Count Answered questions
            iservices.DataAccessWebService WS = new iservices.DataAccessWebService();
            DataSet MyAnswers = WS.ExecuteDatasetStoredProcedure(ConfigurationManager.AppSettings["SecurityDataAccess"], "iweb_sp_custom_coi_SelectCurrentQuestion", MyParams.ToString());



            foreach (DataTable dt in MyAnswers.Tables)
            {
                int rc = 0;

                foreach (DataRow dr in dt.Rows)
                {

                    //Generate unique controls from DS
                    TextBox tbx = new TextBox();
                    tbx.ID = "entity_" + dr["rowID"].ToString();
                    tbx.Text = dr["EntityName"].ToString();
                    tbx.Width = 200;

                    DropDownList DollarRange = new DropDownList();
                    DollarRange.Items.Add("Select Dollar Amount");
                    DollarRange.Items.Add("Up to $1,000");
                    DollarRange.Items.Add("$1,001 - 5,000");
                    DollarRange.Items.Add("$5,001 - $10,000");
                    DollarRange.Items.Add("$10,001 - $50,000");
                    DollarRange.Items.Add("$50,001 - or more");
                    DollarRange.ID = "dollar_" + dr["rowID"].ToString();
                    DollarRange.SelectedValue = dr["DollarRange"].ToString();

                    ImageButton Delete = new ImageButton();
                    Delete.ImageUrl = "delete.png";
                    Delete.ID = "delete_" + dr["rowID"].ToString();
                    Delete.Click += Delete_Click;

                    ImageButton Edit = new ImageButton();
                    Edit.ImageUrl = "edit.png";
                    Edit.ID = "edit_" + dr["rowID"].ToString();
                    Edit.Click += Edit_Click;

                    //Append controls to placeholder
                    DataZone.Controls.Add(new LiteralControl((rc % 2 == 0) ? "<tr><td bgcolor='#f1f0e7'>" : "<tr><td>"));
                    DataZone.Controls.Add(tbx);
                    DataZone.Controls.Add(new LiteralControl((rc % 2 == 0) ? "</td><td bgcolor='#f1f0e7'>" : "</td><td>"));
                    DataZone.Controls.Add(DollarRange);
                    DataZone.Controls.Add(new LiteralControl((rc % 2 == 0) ? "</td><td bgcolor='#f1f0e7'>" : "</td><td>"));
                    DataZone.Controls.Add(Delete);
                    DataZone.Controls.Add(Edit);
                    DataZone.Controls.Add(new LiteralControl("</td></tr>"));
                    rc++;
                }



            }

        }
    }
}

【问题讨论】:

  • 是的,没有数据返回。我检查了数据库,信息仍然存在。如果我通过刷新再次加载页面,我的两个数据都会重新出现。
  • 当您在 UI 上单击 Delete_Click 方法时会触发它吗?
  • 没有。我将代码移到 page_load 部分,它会触发并删除记录,但我的数据在处理修改后的数据之前显示,所以我看到的是旧结果。

标签: c# asp.net


【解决方案1】:

代码的问题在于,如果不是 PostBack,就不要执行 LoadControls。当您动态添加新控件时,它会在页面中注册,因此当调用该控件的回发时 - 页面将知道它应该调用什么方法。

在您的情况下,当 PostBack 发生时您不调用 LoadControls,因此 Page 不知道它应该调用什么方法,因为在页面正在搜索控件以处理当前回发数据时没有控件。

如果您每次都执行 LoadControls 而不检查 PageLoad 中的 IsPostBack,那么 Delete_Click 方法将被正常调用。但是可能会做两个数据请求——一个是在PageLoad中进行控件填充,第二个是在Delete_Click方法中删除和更新新数据。

您的代码还有另一个时刻 - 您正在向 DataZone 添加控件,我想它是 asp:PlaceHolder,但您没有清除它,因此可以为第二个 LoadControls 调用复制控件。像往常一样,您需要先清除 PlaceHolder,然后再更新其中的数据。

【讨论】:

  • 在删除按钮的 Click 事件中,我添加了 DataZone.Controls.Clear();负载控制();它似乎正在工作。我对占位符相当陌生,所以我没有考虑清除它,但这是有道理的。我也每次都注册 LoadControls()。它现在似乎正在工作。你看到我的整体架构有什么问题吗?任何有用的提示将不胜感激!
  • 总体感觉还可以。您还可以尝试使用 Repeater\GridView 控件的唯一一件事,因为它们用于此类事情。所以你不需要动态创建控件。您只需为每一行指定布局,然后加载DataTable,将其设置为repeater.DataSource 属性,并调用repeater.DataBind,它将根据DataTable 项和指定的布局创建所有行。
猜你喜欢
  • 1970-01-01
  • 2011-11-07
  • 2010-12-19
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多