2016-03-23 7 views
1

Ich habe viel für dieses Problem suchen, aber nichts kam.Benutzer Steuerelement dynamisch geladen mit Parametern nicht in asp.net

Mein Problem ist folgendes: Ich habe eine Hauptansicht, in der ich ein Benutzersteuerelement mit Parametern laden möchte, wenn ich auf eine Schaltfläche klicke, aber das Benutzersteuerelement wird nicht angezeigt. Der Konstruktor des Benutzersteuerelements wird aufgerufen und die Parameter werden festgelegt, selbst das Ereignis zum Laden der Seite aus dem Benutzersteuerelement wird aufgerufen. Was mache ich falsch?

Main.aspx:

<%@ Page Title="Main page" Language="C#" AutoEventWireup="true" CodeBehind="Main.aspx.cs" Inherits="MainApp.Main" MasterPageFile="~/Site.master" %> 
    <asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"></asp:Content> 

    <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> 
    <%-- some other fields which i send to the user control on click --%> 
       <div class="col-lg-1 col-sm-12 col-md-1"> 
        <asp:Button runat="server" CssClass="btn btn-primary" CausesValidation="false" ID="generateData" OnClick="generateData_Click" Text="View info" /> 
       </div> 
    <div runat="server" id="contentDiv"> 
     <p>No info available atm.</p> 
    </div> 
</asp:Content> 

Main.aspx.cs Schaltfläche klicken Ereignis:

protected void generateData_Click(object sender, EventArgs e) 
{ 
    UserControl1 uc = (UserControl1)this.LoadControl(typeof(UserControl1), new object[] { param1, param2, param3}); 
    contentDiv.Controls.Clear(); 
    contentDiv.Controls.Add(uc); 
} 

UserControl1.aspx.cs:

public partial class UserControl1: System.Web.UI.UserControl 
{ 
     public string Param3 { get; set; } 
     public string Param1 { get; set; } 
     public string Param2 { get; set; } 

     protected void Page_Load(object sender, EventArgs e) 
     { 
      Page.DataBind(); 
     } 

     public UserControl1(string param1, string param2, string param3) 
     { 
      Param1 = param1; 
      Param2 = param2; 
      Param3 = param3; 
     } 
} 

UserControl1.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="UserControl1.ascx.cs" Inherits="MainApp.UserControls.UserControl1" %> 
<div> 
    <p style="color: red">Under construction</p> 
</div> 

Die Benutzersteuerung ist auf der Hauptseite nicht sichtbar und ich weiß nicht warum.

PS: Ich weiß, dass ich Parameter senden kann, wie unten zu sehen, aber ich verstehe nicht, warum ich die oben beschriebene Methode nicht verwenden kann.

+0

Bitte nehmen Sie sich einen Blick auf [diese] (http://geekswithblogs.net/shahed/archive/2006/03/23/73096.aspx) – Bikee

+0

@BikashSinghMaharjan Es funktioniert, aber warum einige zusätzliche Methode verwenden, statt eingebaute Funktionalität? – Zippy

Antwort

1

Hier ist die vollständige Erklärung, warum zweite Methode mit LoadControl nach Typ nicht funktioniert: Asp.net Usercontrol LoadControl Issue.

Der Grund gibt es einen Unterschied, weil in der zweiten Instanz, die Sie sind den Bindungsmechanismus den die beiden Teilklassen zu umgehen.

Wenn Sie schließen die ascx Steuerung in der Seite als normale Erklärung, die in ihm erklärt Kontrollen (das Label in Ihrem Beispiel) sind automatisch vom Framework instanziiert wie die Klasse ist instanziiert. Dies ist ein bindender Mechanismus, der die "Front-End" Ascx-Datei liest und Objekte in der Klasse instanziiert.

Wenn Sie LoadControl (string) verwenden - Sie tun genau die gleiche Sache .. Es verwendet einen virtuellen Pfad, um die "Front-End" -Datei zu erhalten und sicherzustellen Steuerelemente darin sind instanziiert.

Wenn Sie jedoch die neuen verwenden (2.0) Loadcontrol (Typ, Objekt) Version, gibt es keinen virtuellen Pfad zur Verfügung und es richtig macht also keine Annahmen (wie es nicht, dass ein Typ ein vorderes Ende hat sicherzustellen, Datei).

+0

Danke für die Erklärung. Es scheint seltsam, dass Microsoft eine Methode hinzugefügt hat, die nicht wie erwartet verwendet werden kann. – Zippy

Verwandte Themen