用户控件和构造函数
本文关键字:构造函数 控件 用户 | 更新日期: 2023-09-27 18:00:31
我在ascx页面中用web控件构建了一个用户控件。//ascx文件
<%@ Control Language="C#" AutoEventWireup="true" ClassName="Product"CodeFile="Product.ascx.cs" Inherits="Usercontrols_Product" %>
<link href="../StyleSheet/StyleSheet.css" rel="stylesheet" type="text/css" />
<div>
<asp:Panel ID="box" CssClass="productBox" runat="server">
<asp:Image ID="imgProduct" CssClass="productImage" runat="server" /><br />
<asp:Label ID="lblProductName" CssClass="productLbl" runat="server"></asp:Label><br/>
<asp:Label ID="lblProductPrice" CssClass="productLbl" runat="server"></asp:Label>
</asp:Panel>
</div>
在用户控件的cs文件中,我创建了一个获取另一个类引用的构造函数。在构造函数中得到的类中,我希望将数据插入子控件。//ascx.cs文件
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Usercontrols_Product : System.Web.UI.UserControl
{
public EventHandler cmdDetailsClick;
protected Product thisProduct;
public Usercontrols_Product( Product pr)
{
thisProduct = pr;
imgProduct.ImageUrl = thisProduct.ImageUrl;
lblProductName.Text = thisProduct.CompanyName + "<br/>" + thisProduct.ProductName + " " + thisProduct.Model;
lblProductPrice.Text = thisProduct.Price.ToString() + " " + "israeli shekel";
}
public Usercontrols_Product()
{
}
protected void cmdContinue_clicked(object sender, EventArgs e)
{
//we send to event product class of sender
if (cmdDetailsClick != null)
cmdDetailsClick(thisProduct, EventArgs.Empty);
}
}
问题是,现在有了spesial构造函数,aspx文件中的web控件就不会草签。我试着用new关键字在代码中初始化它们,但它们没有来自ascx文件的属性。没有特殊的构造函数,它可以正常工作。但我需要这个特殊的构造函数。我如何从ascx文件
UserControl由Page实例化(即用户控件的构造函数超出您的控制范围)-您可以定义一个,但将调用默认构造函数。如果你想传递数据,有很多技术可以做到这一点;最简单的方法:
public Product Product {
set {
thisProduct = value;
imgProduct.ImageUrl = value.ImageUrl;
lblProductName.Text = value.CompanyName + "<br/>" +
value.ProductName + " " + value.Model;
lblProductPrice.Text = value.Price.ToString() + " " + "israeli shekel";
}
}
阐明流程如何在背后运作:
.aspx(或.ascx)文件由IIS在运行时编译。例如,如果你有简单的用户控制:
<%@ Control CodeBehind="FooControl.ascx.cs" Inherits="TestApplication.FooControl" %>
<asp:Literal ID="litBar" runat="server" Text="Whatever" />
IIS将从您的控制中生成类似的内容(缩写):
namespace ASP {
public class foocontrol_ascx : global::TestApplication.FooControl {
private static bool @__initialized;
public foocontrol_ascx() {
((global::WebApplication4.FooControl)(this)).AppRelativeVirtualPath = "~/FooControl.ascx";
if ((global::ASP.foocontrol_ascx.@__initialized == false)) {
global::ASP.foocontrol_ascx.@__initialized = true;
}
}
private global::System.Web.UI.WebControls.Literal @__BuildControllitBar() {
global::System.Web.UI.WebControls.Literal @__ctrl;
@__ctrl = new global::System.Web.UI.WebControls.Literal();
this.litBar = @__ctrl;
@__ctrl.ID = "litBar";
@__ctrl.Text = "Whatever";
return @__ctrl;
}
private void @__BuildControlTree(foocontrol_ascx @__ctrl) {
global::System.Web.UI.WebControls.Literal @__ctrl1;
@__ctrl1 = this.@__BuildControllitBar();
System.Web.UI.IParserAccessor @__parser = ((System.Web.UI.IParserAccessor)(@__ctrl));
@__parser.AddParsedSubObject(@__ctrl1);
}
protected override void FrameworkInitialize() {
base.FrameworkInitialize();
this.@__BuildControlTree(this);
}
}
}
请注意,构建的类从代码背后继承,并负责标记(请参阅它如何创建litBar并将文本设置为"Whatever")。此外,这个类只有一个构造函数-默认构造函数(所以它自然会从代码后面的类中调用默认构造函数)。I.E.-您可以为控件定义自定义构造函数,但无论如何都必须提供默认构造函数(这样生成的类就可以使用它),而生成的类会忽略它(因为IIS可能不知道您要传递给自定义构造函数的参数)。