2010-06-02 1 views
1

J'ai un contrôle utilisateur avec un contrôle serveur WebDateTimeEdit dessus (essentiellement un TextBox). J'aimerais pouvoir définir certaines propriétés du contrôle serveur au moyen du balisage du contrôle utilisateur ou par programmation. par exemple, j'ai défini ce sur mon contrôle utilisateur:Comment mapper une propriété de contrôle d'utilisateur asp.net à un contrôle de serveur à l'intérieur de celle-ci?

public string CssClass 
{ 
    get { return this.WebDateTimeEdit1.CssClass; } 
    set { this.WebDateTimeEdit1.CssClass = value; } 
} 

qui me permet de faire

<uc1:MyControl ID="MyControl1" runat="server" CssClass="fancycss" /> 

et cela fonctionne. mais si je veux ajouter un contrôle par le code,

MyControl myControl2 = new MyControl(); 
MyControl.CssClass = "fancycss"; 

ce souffle parce WebDateTimeEdit1 est null.

Y a-t-il un moyen de rendre cela possible? aussi peut faire ce que je fais

myControl2 .Font.Size = FontUnit.Point(8); 

où la propriété Font est en lecture seule sur le contrôle du serveur?

Répondre

1

Cela dépend de la façon dont votre commande est définie (est-ce une CompositeControl?), Mais en général, vous voulez appeler EnsureChildControls() comme la première ligne du compositeur (et probablement le getter aussi)

+0

Je l'ai en tant que «public partiel classe MyControl: System.Web.UI.UserControl». Devrais-je le changer? – lincolnk

+0

Vous ne devriez pas nécessairement le changer, ça peut aller. Mais je recommande de regarder dans 'System.Web.UI.WebControls.CompositeControl' et voir si cela fonctionne mieux, c'est une classe spécialement conçue pour faire des contrôles qui sont composés de sous-contrôles. C'est une classe de base sympa avec laquelle travailler. –

+0

EnsureChildControls() ne semblait pas fonctionner avec UserControl comme base (peut-être que je me trompe) donc je l'ai reconstruit à partir d'une base CompositeControl. semble fonctionner, merci! – lincolnk

0

La question que vous sont confrontés au fait que les contrôles Web par nature sont apatrides. Vous devez conserver la valeur des propriétés que vous définissez afin qu'elles soient accessibles entre les publications. Voici un exemple qui implémente asp.net viewstate. Ainsi, par exemple, pour activer l'état et éviter la condition nulle que vous rencontrez avec la propriété CssClass de votre contrôle personnalisé, vous pouvez implémenter la propriété comme suit.

private string CssClass 
{ 
    get 
    { 
    return (string)ViewState["cssclass"]; 
    } 
    set 
    { 
    ViewState["cssclass"] = value; 
    } 
} 

J'ai inclus un contrôle utilisateur exemple je l'ai écrit récemment qui vous donnera un modèle pour travailler.

using System; 
using System.Data; 
using System.Configuration; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.ComponentModel; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 

namespace Pdc.EventPro.WebControls 
{ 
    [DefaultProperty("Text"), ToolboxData("<{0}:AnchorDomain1 runat=server></{0}:AnchorDomain1>")] 
    public class AnchorDomain : Control 
    { 
    private string _href = string.Empty; 

    public AnchorDomain() 
    { 
     VirtualPath = HttpContext.Current.Request.Path.Substring(0, HttpContext.Current.Request.Path.LastIndexOf("/") + 1); 
    } 

    private string VirtualPath 
    { 
     get 
     { 
     return (string)ViewState["virtualPath"]; 
     } 
     set 
     { 
     ViewState["virtualPath"] = value; 
     } 
    } 

    [Bindable(true), Category("Content"), DefaultValue("Performance Development Corporation")] 
    public string Title 
    { 
     get 
     { 
     return (string)ViewState["title"]; 
     } 

     set 
     { 
     ViewState["title"] = value; 
     } 
    } 

    [Bindable(true), Category("Content"), DefaultValue("")] 
    public string LinkText 
    { 
     get 
     { 
     return (string)ViewState["linktext"]; 
     } 

     set 
     { 
     ViewState["linktext"] = value; 
     } 
    } 

    [Bindable(true), Category("Content"), DefaultValue("")] 
    public string Url 
    { 
     get 
     { 
     return (string)ViewState["url"]; 
     } 

     set 
     { 
     ViewState["url"] = value; 
     } 
    } 

    [Bindable(true), Category("Content"), DefaultValue("false")] 
    public bool UsePageVirtualPath 
    { 
     get 
     { 
     return (bool)ViewState["useVirtualPath"]; 
     } 

     set 
     { 
     ViewState["useVirtualPath"] = value; 
     } 
    } 

    [Bindable(true), Category("Content"), DefaultValue("false")] 
    public string CssClass 
    { 
     get 
     { 
     return (string)ViewState["CssClass"]; 
     } 

     set 
     { 
     ViewState["CssClass"] = value; 
     } 
    } 

    protected override void Render(HtmlTextWriter writer) 
    { 
     if (string.IsNullOrEmpty(Url) && UsePageVirtualPath == false) 
     { 
     _href = CreateUri(HttpContext.Current.Request.Url.GetLeftPart(System.UriPartial.Authority), HttpContext.Current.Request.ApplicationPath).ToString(); 
     } 
     else if (!string.IsNullOrEmpty(Url) && UsePageVirtualPath == true) 
     { 
     _href = CreateUri(HttpContext.Current.Request.Url.GetLeftPart(System.UriPartial.Authority), CombineUri(VirtualPath, Url)).ToString(); 
     } 
     else 
     { 
     _href = CreateUri(HttpContext.Current.Request.Url.GetLeftPart(System.UriPartial.Authority), CombineUri(HttpContext.Current.Request.ApplicationPath, Url)).ToString(); 
     } 

     writer.WriteBeginTag("a"); 
     writer.WriteAttribute("href", _href); 
     writer.WriteAttribute("title", Title); 
     writer.WriteAttribute("class", CssClass); 
     writer.Write(HtmlTextWriter.TagRightChar); 
     writer.Write(LinkText); 
     writer.WriteEndTag("a"); 

     base.Render(writer); 
    } 

    private Uri CreateUri(string baseUri, string relativeUri) 
    { 
     Uri result = null; 

     if (Uri.TryCreate(new Uri(baseUri), relativeUri, out result)) 
     { 
     return result; 
     } 

     return result; 
    } 

    private string CombineUri(string basePath1, string basePath2) 
    { 
     return string.Format("{0}/{1}", basePath1.TrimEnd('/'), basePath2.TrimStart('/')); 
    } 
    } 
} 

Profitez-en!

+0

Il ne veut pas conserver CssClass dans le ViewState du contrôle parent mais plutôt le pousser vers le bas dans un contrôle enfant. Le contrôle enfant doit stocker le CssClass dans son ViewState. –