用户控件在回发时添加,但不显示

时间:2012-07-09 11:28:22

标签: c# asp.net user-controls

我在UpdatePanel中有一个占位符控件,当点击Add Vehicle按钮时,我需要一个新的“行”控件出现(第一个“行”以声明方式添加)。然而,UserControl已添加但未显示。我怎样才能解决这个问题?

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>

1 个答案:

答案 0 :(得分:1)

问题是您在UserControl的新实例上使用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,为每个ID调用LoadControl,在循环时设置控件ID(这是为了将过去的viewstate重新应用于用户控件所必需的。

我还会将该循环移动到Page_Init或Page_Load,以便动态创建的用户控件可以正确地参与页面的生命周期。在单击事件中创建它们为时已晚,无法捕获自己的事件,并且在该点击事件之外的回发情况下根本不会创建它们。