2010-06-02 7 views
1

사용자 콘트롤에 WebDateTimeEdit 서버 콘트롤 (본질적으로 TextBox)이 있습니다. 사용자 정의 컨트롤의 방법으로 또는 프로그래밍 방식으로 서버 컨트롤의 속성 중 일부를 설정할 수 싶습니다. 예를 들어 나는이 내 사용자 컨트롤에 정의가 있습니다asp.net 사용자 정의 컨트롤 속성을 서버 컨트롤에 매핑하는 방법은 무엇입니까?

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

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

을 수행 할 수 있습니다이 작동한다. 하지만 난 WebDateTimeEdit1null 때문에이 불면

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

, 코드를 통해 컨트롤을 추가합니다.

이렇게 할 수있는 방법이 있습니까? 또한 나는 Font 특성은 서버 컨트롤에 읽기이

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

을 할 수 있습니까? 그것은 당신의 컨트롤이 정의 된 방법에 따라 달라집니다

답변

1

는 일반적으로이 문제 (너무과 가능성 게터)을

+0

나는 그것을'public partial class MyControl : System.Web.UI.UserControl'으로 가지고 있습니다. 나는 그것을 바꿔야합니까? – lincolnk

+0

반드시 변경하지 않아도됩니다. 하지만 'System.Web.UI.WebControls.CompositeControl'을 살펴보고 그 것이 더 잘 작동하는지 확인해 보려면 하위 컨트롤로 구성된 컨트롤을 만들기 위해 특별히 고안된 클래스입니다. 함께 작업 할 수있는 훌륭한 기본 클래스입니다. –

+0

EnsureChildControls() UserControl 기본 (어쩌면 내가 잘못하고 있어요) 작동하지 않는 것처럼 보였습니다 그래서 나는 그것을 CompositeControl 자료에서 다시 작성했습니다. 고마워! – lincolnk

0

을 세터의 첫 번째 줄과 같은 EnsureChildControls()를 호출 할, 말하기 (?를 CompositeControl 그 것이다) 그러나 웹 컨트롤이 본질적으로 무국적이라는 사실 때문입니다. 포스트 백간에 액세스 할 수 있도록 설정중인 등록 정보의 값을 유지해야합니다. 아래는 asp.net viewstate를 구현 한 예제입니다.

예를 들어 상태를 활성화하고 사용자 정의 컨트롤의 CssClass 속성에서 null 조건이 발생하지 않도록하려면 다음과 같이 propery를 구현할 수 있습니다.

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

즐기십시오!

+0

그는 부모 컨트롤의 ViewState에 CssClass를 유지하지 않고 자식 컨트롤에 밀어 넣기를 원합니다. 하위 컨트롤은 ViewState에 CssClass를 저장해야합니다. –

관련 문제