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?