我刚开始使用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>
任何帮助将不胜感激。我想知道是否可以在自定义控件中使用泛型,如果可以,如何解决我的问题?
答案 0 :(得分: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>
不知道如何传递填充的数据对象。在标记中,您只能访问字符串类型属性。因此,您可以做的是定义您尝试绑定的类型名称,以便您可以使用反射来加载类型并旋转您正在执行的所有属性。但你仍然需要设置类似DataSource的东西并使用数据绑定来绑定到Enumerable对象。
在SO上查看此相关question。