Ошибка компиляции при динамической настройке свойства пользовательского элемента управления внутри ретранслятора - PullRequest
0 голосов
/ 04 августа 2020

На веб-сайте C# Webforms (не веб-приложении) у меня есть следующие настройки:

Страница, которая включает Step.ascx, который включает asp:Repeater.

Повторитель в Step.ascx отображает все разделы (Section.ascx) на этом шаге.

SectionInfoProvider.GetSections(1).ToList() возвращает список SectionInfo, который является классом нескольких свойств, включая DisplayName в виде строки.

Я получаю сообщение об ошибке компиляции (не удалось найти тип или имя пространства имен) при попытке динамически установить свойство SectionInfo пользовательского элемента управления Section в репитер в Step.ascx.cs. Я пробовал использовать частичное имя класса пользовательского элемента управления и 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;
    }
} 

1 Ответ

0 голосов
/ 04 августа 2020

Я думаю, вам просто нужно приведение типов и 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");
...
}

Это то, что вы уже пробовали?

Создание элементов управления Dynami c можно сделать, но это отдельная вопрос.

...