2

UpdatePanel内にプレースホルダーコントロールがあり、[車両の追加]ボタンをクリックすると、コントロールの新しい「行」が表示される必要があります(最初の「行」が宣言的に追加されます)。ただし、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>
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をループし、それぞれに対してLoadControlを呼び出し、ループしながらコントロールIDを設定します(これは、過去のビューステートをユーザーコントロールに再適用するために必要です。

また、動的に作成されたユーザーコントロールがページのライフサイクルに適切に参加できるように、そのループをPage_InitまたはPage_Loadのいずれかに移動します。そのクリックイベントでそれらを作成するには遅すぎて、自分のイベントをキャッチできません。また、そのクリックイベント以外のポストバックの場合、それらはまったく作成されません。

于 2012-07-09T15:20:05.690 に答える