在转发器中动态设置用户控件 属性 时出现编译错误
Compilation error when dynamically setting property of user control inside repeater
在 C# Webforms 网站(不是 Web 应用程序)中,我进行了以下设置:
一个页面,其中包含 Step.ascx,其中包含一个 asp:Repeater
。
Step.ascx 中的转发器显示此步骤中的所有部分 (Section.ascx
)。
SectionInfoProvider.GetSections(1).ToList()
returns SectionInfo
的列表,这是一个 class 几个属性,包括 DisplayName
作为字符串。
尝试将 Section
用户控件的 SectionInfo
属性 动态设置到Step.ascx.cs 中的中继器。我试过使用用户控件的部分 class 名称和 UserControl
,但都不起作用。
我也在尝试创建 SectionControls
的集合,因为我也想将其用于页面上的其他内容。
我做错了什么?
Step.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="~/Step.ascx.cs" Inherits="Custom_Step" %>
<%@ Register TagPrefix="uc" TagName="Section" Src="~/Section.ascx" %>
<asp:Repeater runat="server" ID="rptSections" OnItemDataBound="rptSections_OnItemDataBound" EnableViewState="True">
<ItemTemplate>
<uc:Section runat="server" ID="Section" EnableViewState="True"/>
</ItemTemplate>
</asp:Repeater>
Step.ascx.cs
public partial class Custom_Step : System.Web.UI.UserControl
{
public IEnumerable<SectionInfo> Sections { get; set; }
private IEnumerable<???> SectionControls { get; set; } <-- What should ??? be?
protected override void OnLoad(EventArgs e)
{
Sections = SectionInfoProvider.GetSections(1).ToList();
rptSections.DataSource = Sections;
rptSections.DataBind();
}
protected void rptSections_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
var info = (SectionInfo)e.Item.DataItem;
var ctrl = (???)e.Item.FindControl("Section"); <-- What should ??? be?
ctrl.SectionInfo = info;
if (SectionControls == null) SectionControls = new List<???>(); <-- What should ??? be?
((List<???>)SectionControls).Add(ctrl); <-- What should ??? be?
}
}
Section.ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="~/Section.ascx.cs" Inherits="Custom_Section " %>
<h3><asp:Literal runat="server" ID="litSectionHeading" /></h3>
Section.ascx.cs:
public partial class Custom_Section : System.Web.UI.UserControl
{
public SectionInfo SectionInfo { get; set; }
protected override void OnLoad(EventArgs e)
{
litSectionHeading.Text = SectionInfo.DisplayName;
}
}
我认为你只需要一个类型转换和一个 if。
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {`
...
var ctrl = e.Item.FindControl<Custom_Section>("Section");`
or
var ctrl = (Section)e.Item.FindControl("Section");
...
}
你已经尝试过了吗?
可以创建动态控件,但这是一个单独的问题。
在 C# Webforms 网站(不是 Web 应用程序)中,我进行了以下设置:
一个页面,其中包含 Step.ascx,其中包含一个 asp:Repeater
。
Step.ascx 中的转发器显示此步骤中的所有部分 (Section.ascx
)。
SectionInfoProvider.GetSections(1).ToList()
returns SectionInfo
的列表,这是一个 class 几个属性,包括 DisplayName
作为字符串。
尝试将 Section
用户控件的 SectionInfo
属性 动态设置到Step.ascx.cs 中的中继器。我试过使用用户控件的部分 class 名称和 UserControl
,但都不起作用。
我也在尝试创建 SectionControls
的集合,因为我也想将其用于页面上的其他内容。
我做错了什么?
Step.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="~/Step.ascx.cs" Inherits="Custom_Step" %>
<%@ Register TagPrefix="uc" TagName="Section" Src="~/Section.ascx" %>
<asp:Repeater runat="server" ID="rptSections" OnItemDataBound="rptSections_OnItemDataBound" EnableViewState="True">
<ItemTemplate>
<uc:Section runat="server" ID="Section" EnableViewState="True"/>
</ItemTemplate>
</asp:Repeater>
Step.ascx.cs
public partial class Custom_Step : System.Web.UI.UserControl
{
public IEnumerable<SectionInfo> Sections { get; set; }
private IEnumerable<???> SectionControls { get; set; } <-- What should ??? be?
protected override void OnLoad(EventArgs e)
{
Sections = SectionInfoProvider.GetSections(1).ToList();
rptSections.DataSource = Sections;
rptSections.DataBind();
}
protected void rptSections_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
var info = (SectionInfo)e.Item.DataItem;
var ctrl = (???)e.Item.FindControl("Section"); <-- What should ??? be?
ctrl.SectionInfo = info;
if (SectionControls == null) SectionControls = new List<???>(); <-- What should ??? be?
((List<???>)SectionControls).Add(ctrl); <-- What should ??? be?
}
}
Section.ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="~/Section.ascx.cs" Inherits="Custom_Section " %>
<h3><asp:Literal runat="server" ID="litSectionHeading" /></h3>
Section.ascx.cs:
public partial class Custom_Section : System.Web.UI.UserControl
{
public SectionInfo SectionInfo { get; set; }
protected override void OnLoad(EventArgs e)
{
litSectionHeading.Text = SectionInfo.DisplayName;
}
}
我认为你只需要一个类型转换和一个 if。
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {`
...
var ctrl = e.Item.FindControl<Custom_Section>("Section");`
or
var ctrl = (Section)e.Item.FindControl("Section");
...
}
你已经尝试过了吗?
可以创建动态控件,但这是一个单独的问题。