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>
4

1 回答 1

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(这是为了将过去的视图状态重新应用到用户控件所必需的。

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

于 2012-07-09T15:20:05.690 回答