2012-07-09 38 views
2

我在UpdatePanel中有一个占位符控件,并且当单击添加车辆按钮时,我需要一个新的“行”控件出现(第一个“行”是添加声明)。用户控件然而被添加但不显示。我怎样才能解决这个问题?用户控件在回发上添加,但不显示

protected void AddVehicleButton_Click(object sender, EventArgs e) 
     { 

      int count = Convert.ToInt32(VehicleRegistrationCountHiddenField.Value); 
      var TBId = "VehicleRegistrationEnhancedTextBox" + count; 
      IList<Panel> oldPanels = (IList<Panel>)Session["VehiclePanels"] ?? new List<Panel>(); 

      //Seperator 
      Literal hr = new Literal { Text = "<HR/>" }; 

      //Vehicle Registration 
      UserControl uc = new UserControl(){ID="3"}; 
      uc.LoadControl("~/Controls/ImageUploadAndCrop/ImageUploadAndCrop.ascx"); 


      Label vehicleRegistration = new Label 
              { 
               ID = TBId + "_Label", 
               AssociatedControlID = TBId, 
               Text = "Vehicle Registration:" 
              }; 
      EnhancedTextBox vehicleTypeTextBox = new EnhancedTextBox 
                { 
                 ID = TBId, 
                 Required = true, 
                 RequiredErrorText = "Vehicle Registration is a required field." 
                }; 

      //Readd previously added panels 
      foreach (var addedPanel in oldPanels) 
      { 
       AddVehiclePlaceholder.Controls.Add(addedPanel); 
      } 

      //Add new controls to the form 
      Panel newPanel = new Panel(); 

      newPanel.Controls.Add(hr); 
      newPanel.Controls.Add(uc); 
      newPanel.Controls.Add(vehicleRegistration); 
      newPanel.Controls.Add(vehicleTypeTextBox); 

      AddVehiclePlaceholder.Controls.Add(newPanel); 

      //Increment the ID count 
      count++; 
      VehicleRegistrationCountHiddenField.Value = count.ToString(); 

      //Save the panel to the Session. 
      oldPanels.Add(newPanel); 
      Session["VehiclePanels"] = oldPanels;   

     } 

的HTML低于:

<div id="Step2" style="" data-step="2"> 
<h2> Step 2 (optional): Capture the offender(s) vehicle Information. </h2> 
<hr> 
<div id="VehicleTypeFields"> 
<div> 
<label for="">Vehicle Registration</label> 
<div id="Body_Body_UpdatePanel1"> 
<div> 
<div> 
<script type="text/javascript" src="/Controls/ImageUploadAndCrop/Javascript/jquery.Jcrop.min.js"> 
<link type="text/css" rel="stylesheet" href="/Controls/ImageUploadAndCrop/CSS/jquery.Jcrop.css"> 
<script type="text/javascript"> 
<div> 
<div id="Body_Body_VehicleRegistrationImageUploadAndCrop_UploadPanel"> 
</div> 
<input id="Body_Body_VehicleRegistrationEnhancedTextBox" type="text" placeholder="CA123-456" name="ctl00$ctl00$Body$Body$VehicleRegistrationEnhancedTextBox"> 
</div> 
</div> 
</div> 
</div> 
<div id="Body_Body_AddVehiclesUpdatePanel"> 
<input id="Body_Body_VehicleRegistrationCountHiddenField" type="hidden" value="2" name="ctl00$ctl00$Body$Body$VehicleRegistrationCountHiddenField"> 
<div> 
<hr> 
<label id="Body_Body_VehicleRegistrationEnhancedTextBox1_Label" for="Body_Body_VehicleRegistrationEnhancedTextBox1">Vehicle Registration:</label> 
<input id="Body_Body_VehicleRegistrationEnhancedTextBox1" type="text" name="ctl00$ctl00$Body$Body$VehicleRegistrationEnhancedTextBox1"> 
<span id="Body_Body_VehicleRegistrationEnhancedTextBox1_RequiredFieldValidator" style="display:none;">Vehicle Registration is a required field.</span> 
</div> 
</div> 
</div> 
+0

你能告诉我们HTML – Adil 2012-07-09 11:30:17

回答

1

的问题是你对用户控件的新实例,而不是页面的执行LoadControl使用。 IE浏览器,而不是这样的:

UserControl uc = new UserControl(){ID="3"}; 
uc.LoadControl("~/Controls/ImageUploadAndCrop/ImageUploadAndCrop.ascx"); 

而是执行此操作:

Control uc = LoadControl("~/Controls/ImageUploadAndCrop/ImageUploadAndCrop.ascx"); 
uc.ID = 3; 

我认为这将解决您的,没有任何显示,但仍有其他问题迫在眉睫的问题。尽管可能会将整个控件存储在会话状态中,但我自己的测试显示这样做存在异常。我会确保给每个用户控件的实例一个唯一的ID(每次不是“3”),并将这些ID存储在某个地方。然后循环通过这些ID,为每一个调用LoadControl,在循环时设置控件ID(为了将过去的视图状态重新应用于用户控件,这是必需的)

我也将该循环移至Page_Init或Page_Load,这样你的动态创建的用户控件就可以正确地参与到页面的生命周期中,在那个点击事件中创建它们对于他们捕捉他们自己的事件来说已经太晚了,并且在回调之外的情况下它们将不会被创建那点击事件

相关问题