как мне сопоставить свойство пользовательского элемента управления asp.net с серверным элементом управления в нем? - PullRequest
1 голос
/ 02 июня 2010

У меня есть пользовательский элемент управления с сервером WebDateTimeEdit (по сути, TextBox). Я хотел бы иметь возможность устанавливать некоторые свойства серверного элемента управления с помощью разметки пользовательского элемента управления или программно. например, я определил это в моем пользовательском элементе управления:

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

, что позволяет мне сделать

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

и это работает. но если я хочу добавить элемент управления через код,

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

это взрывается, потому что WebDateTimeEdit1 - это null.

Есть ли способ, которым я могу это сделать? Также я могу сделать это

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

где свойство Font доступно только для чтения на серверном элементе управления?

Ответы [ 2 ]

1 голос
/ 02 июня 2010

Это зависит от того, как определяется ваш элемент управления (это CompositeControl?), Но, вообще говоря, вы хотите назвать EnsureChildControls() в качестве первой строки установщика (и, вероятно, тоже получателя)

0 голосов
/ 02 июня 2010

Проблема, с которой вы сталкиваетесь, связана с тем, что веб-элементы управления по своей природе не имеют состояния. Вам необходимо сохранить значение свойств, которые вы устанавливаете, чтобы они были доступны между постбэками. Ниже приведен пример, который реализует asp.net viewstate.

Так, например, чтобы включить состояние и избежать возникновения нулевого условия, которое вы испытываете со свойством CssClass своего пользовательского элемента управления, вы можете реализовать свойство следующим образом.

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

Я включил пример пользовательского элемента управления, который я недавно написал, который даст вам модель для работы.

    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('/')); 
    }
  }
}

Наслаждайтесь!

...