2013-12-18 5 views
0

У меня есть код ниже, который работает нормально; когда я нажимаю кнопку удаления, событие срабатывает, но изменения не отображаются на PostBack. Это, очевидно, имеет отношение к управлению PostBack. У кого-нибудь есть предложения?Проблемы с обратной связью с событиями OnClick

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



      } 

     } 
    } 
} 
+0

Да, данные не возвращаются. Я проверил БД, и информация все еще там. Если я снова загружу страницу с обновлением, мои мои данные снова появятся. –

+0

Устраняет ли метод Delete_Click, когда вы нажимаете его в пользовательском интерфейсе? –

+0

Нет. Я переместил код в раздел page_load, и он запускает и удаляет запись, но мои данные отображаются до обработки пересмотренных данных, поэтому я вижу старые результаты. –

ответ

0

Проблема с кодом заключается в том, что не выполняйте LoadControls, если это не PostBack. Когда вы добавляете новый элемент управления динамически, он регистрируется внутри страницы, поэтому, когда будет вызван обратный вызов для этого элемента управления - страница будет знать, какой метод он должен назвать.

В случае, когда PostBack случается, вы не вызываете LoadControls, поэтому Страница не знает, какой метод он должен вызывать, так как в данный момент нет контроля в момент, когда страница ищет элемент управления для обработки текущих данных обратной передачи.

Если вы будете выполнять LoadControls каждый раз, не проверяя IsPostBack в PageLoad, тогда метод Delete_Click будет называться точным. Но в этом случае могут выполняться два запроса данных: один для контроля заполнения в PageLoad, второй - для удаления и обновления новых данных методом Delete_Click.

Есть еще один момент с вашим кодом - вы добавляете элементы управления к DataZone, который, я полагаю, является asp: PlaceHolder, но вы его не очищаете, поэтому элементы управления можно дублировать для второго вызова LoadControls. Как обычно, вам необходимо очистить PlaceHolder перед обновлением данных.

+0

В событии Click для кнопки удаления я добавил DataZone.Controls.Clear(); LoadControls(); Кажется, что он работает. Я довольно новичок в заполнителях, поэтому я не думал об этом, но это имеет смысл. Я также регистрирую LoadControls() каждый раз. Кажется, сейчас работает. Вы видите какие-либо проблемы с моей общей архитектурой? Любые полезные советы будут оценены! –

+0

В целом это нормально. Единственное, что вы можете также попробовать использовать элементы Repeater \ GridView, поскольку они используются для таких вещей. Поэтому вам не нужно создавать элементы управления динамически. Вы просто указываете макет для каждой строки, затем загружаете DataTable, устанавливаете его в свойство repeater.DataSource и вызываете repeatater.DataBind, и он будет создавать все строки на основе элементов DataTable и указанного макета. –

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