2017-02-23 4 views
2

저는 ASP.NET에서 사용자 지정 컨트롤을 사용하기 시작했으며이 컨트롤을 사용하여 개체 목록에 대한 테이블을 만들려고했습니다.ASP.NET에서 사용자 지정 일반 컨트롤을 사용할 수 있습니까?

여기 내 사용자 지정 컨트롤입니다 :

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Linq; 
using System.Reflection; 
using System.Web; 
using System.Web.ModelBinding; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace Jordan.Custom.CS.Controls 
{ 

    [DefaultProperty("Text"), ToolboxData("<{0}:ObjectTable runat=\"server\"> </{0}:ObjectTable>")] 
    public class ObjectTable<T> : WebControl 
    { 
     public ObjectTable() { } 
     [Bindable(true)] 
     [Category("Appearance")] 
     [DefaultValue("")] 
     [Localizable(true)] 

     public string Text 
     { 
      get 
      { 
       string s = (string)ViewState["Text"]; 
       return ((string.IsNullOrEmpty(s)) ? "[" + this.ID + "]" : s); 
      } 
      set 
      { 
       ViewState["Text"] = value; 
      } 
     } 
     [Bindable(true), Category("Data"), DefaultValue(""), Localizable(true)] 
     public List<T> ObjectValue 
     { 
      get { return (List<T>)ViewState["ObjectValue"]; } 
      set { ViewState["ObjectValue"] = value; } 
     } 
     [Bindable(true), Category("Appearance"), DefaultValue(""), Localizable(true)] 
     public string Heading 
     { 
      get { return ViewState["heading"].ToString(); } 
      set { ViewState["Heading"] = value; } 
     } 
     protected override HtmlTextWriterTag TagKey 
     { 
      get { return HtmlTextWriterTag.Div; } 
     } 
     protected override void AddAttributesToRender(HtmlTextWriter writer) 
     { 
      writer.AddAttribute(HtmlTextWriterAttribute.Style, "text-align:center;color:red;"); 
     } 
     protected override void RenderContents(HtmlTextWriter writer) 
     { 
      writer.Write("<h1>"+this.Heading+"</h1>"); 
      writer.Write("<br />"); 
      writer.RenderBeginTag(HtmlTextWriterTag.Table); 
      writer.RenderBeginTag("<tr>"); 
      foreach (PropertyInfo prop in typeof(T).GetProperties()) //Pulls all the properties from the generic object 
      { 
       writer.RenderBeginTag("<th>"); 
       writer.Write(prop.Name); 
       writer.RenderEndTag(); // th 
      } 
      writer.RenderEndTag(); // tr 
      writer.RenderEndTag(); // table 
     } 
    } 
} 

하지만 페이지의 내 사용자 지정 컨트롤을 사용하려고 할 때, 그것은 작동하지 않습니다. 예상 한대로 수행하는 대신 다음을 제공합니다.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 
<%@ Register TagPrefix="Jordan" Namespace="Jordan.Custom.CS.Controls" %> 
<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head runat="server"> 
     <title></title> 
    </head> 
    <body> 
     <form id="form1" runat="server"> 
      <div> 
       <Jordan:ObjectTable`1 /> 
      </div> 
     </form> 
    </body> 
</html> 

아무 도움이됩니다. 사용자 정의 컨트롤에서 제네릭을 사용할 수 있는지, 내 문제를 해결하는 방법을 알고 싶습니다.

답변

2

페이지에 컨트롤을 배치하는 것과 관련하여 사용자 지정 컨트롤을 사용하여 수행 할 수 있다고 생각하지 않습니다. 그래서

<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head runat="server"> 
     <title></title> 
    </head> 
    <body> 
     <form id="form1" runat="server"> 
      <div> 
       <Jordan:ObjectTable`1 /> 
      </div> 
     </form> 
    </body> </html> 

채워진 데이터 객체를 전달하는 방법을 모른다. 마크 업에서는 문자열 유형 속성에만 액세스 할 수 있습니다. 그래서 바인딩을하려고하는 typename을 정의하는 것이 가능합니다. 그래서 리플렉션을 사용하여 유형을로드하고 현재 수행중인 모든 속성을 돌릴 수 있습니다. 하지만 여전히 DataSource와 같은 것을 설정하고 Enumerable 객체에 바인딩하기 위해 데이터 바인딩을 사용해야합니다.

SO 관련 정보는 question을 참조하십시오.

관련 문제