用户控件和构造函数

本文关键字:构造函数 控件 用户 | 更新日期: 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 + "&nbsp" + thisProduct.Model;
        lblProductPrice.Text = thisProduct.Price.ToString() + "&nbsp" + "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 + "&nbsp" + value.Model;
    lblProductPrice.Text = value.Price.ToString() + "&nbsp" + "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可能不知道您要传递给自定义构造函数的参数)。