2017-02-23 5 views
2

Je viens de commencer à travailler avec des contrôles personnalisés dans ASP.NET et je voulais essayer de l'utiliser pour créer une table pour une liste d'objets.Est-il possible d'avoir des contrôles génériques personnalisés dans ASP.NET?

Voici mon contrôle personnalisé:

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 
     } 
    } 
} 

Mais lorsque je tente d'utiliser mon contrôle personnalisé sur la page, il ne fonctionne pas. Au lieu de faire ce que je m'attendrais à ce qu'il fasse, il donne ceci:

<%@ 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> 

Toute aide serait appréciée. Je voudrais savoir s'il est possible d'utiliser des génériques dans les contrôles personnalisés et si oui comment résoudre mon problème?

Répondre

2

Je ne pense pas que ce que vous faites est possible avec un contrôle personnalisé en ce qui concerne la mise en place du contrôle sur la page. Donc

<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> 

ne sait pas comment passer un objet de données rempli. Dans le balisage, vous avez uniquement accès aux propriétés de type chaîne. Donc, ce que vous pouvez faire est de définir le nom de fichier que vous essayez de lier afin que vous puissiez utiliser la réflexion pour charger le type et faire défiler toutes les propriétés comme vous le faites actuellement. Mais vous devez toujours définir quelque chose comme DataSource et utiliser la liaison de données pour lier à un objet Enumerable.

Voir ceci question associé sur SO.