User Control Inside Repeater

前端 未结 2 1600
悲哀的现实
悲哀的现实 2020-12-29 08:13

I have a UserControl inside a repeater. The repeater\'s datasource is from SQL Server.

User Control\'s .cs - MoviePanel.ascx.cs:


public int m         


        
相关标签:
2条回答
  • 2020-12-29 08:35

    Your code is working fine; I tested it (see the bottom of the page). The worst case you can try assigning those value inside ItemDataBound event.

    <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
        <ItemTemplate>
            <uc1:MoviePanel runat="server" id="MovieDetailPanel1" />
        </ItemTemplate>
    </asp:Repeater>
    
    public class Movie
    {
        public int MovieID { get; set; }
        public string MovieName { get; set; }
        public string MovieDescription { get; set; }
    }
    
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Repeater1.DataSource = new List<Movie>
            {
                new Movie {MovieID = 1, MovieName = "One", MovieDescription = "One hundred"},
                new Movie {MovieID = 2, MovieName = "Two", MovieDescription = "Two hundreds"},
                new Movie {MovieID= 3, MovieName = "Three", MovieDescription = "Three hundreds"},
            };
            Repeater1.DataBind();
        }
    }
    
    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item ||
            e.Item.ItemType == ListItemType.AlternatingItem)
        {
            var movie = e.Item.DataItem as Movie;
    
            var control = e.Item.FindControl("MovieDetailPanel1") as MoviePanel;
            control.myMovieID = movie.MovieID;
            control.myMovieDescription = movie.MovieDescription;
            control.myMovieName = movie.MovieName;
        }
    }
    

    enter image description here

    Here is how I test your original question

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebDemo.WebForm1" %>
    
    <%@ Register src="MoviePanel.ascx" tagname="MoviePanel" tagprefix="uc1" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
            <asp:Repeater ID="Repeater1" runat="server">
                <ItemTemplate>
                    <uc1:MoviePanel runat="server" mymovieid='<% #Eval("MovieID") %>'
                        mymoviename='<% #Eval("movieName") %>'
                        mymoviedescription='<% #Eval("movieDescription") %>'
                        id="MovieDetailPanel1" />
                </ItemTemplate>
            </asp:Repeater>
        </form>
    </body>
    </html>
    
    
    namespace WebDemo
    {
        public partial class WebForm1 : System.Web.UI.Page
        {
            public class Movie
            {
                public int MovieID { get; set; }
                public string MovieName { get; set; }
                public string MovieDescription { get; set; }
            }
    
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    Repeater1.DataSource = new List<Movie>
                    {
                        new Movie {MovieID = 1, MovieName = "One", MovieDescription = "One hundred"},
                        new Movie {MovieID = 2, MovieName = "Two", MovieDescription = "Two hundreds"},
                        new Movie {MovieID= 3, MovieName = "Three", MovieDescription = "Three hundreds"},
                    };
                    Repeater1.DataBind();
                }
            }
        }
    }
    
    <%@ Control Language="C#" AutoEventWireup="true"
        CodeBehind="MoviePanel.ascx.cs" Inherits="WebDemo.MoviePanel" %>
    
    <p>
        <strong>Inside Control</strong>:
        <asp:Label ID="MovieIDLbl" runat="server" />
        <asp:Label ID="MovieNameLbl" runat="server" />
        <asp:Label ID="DescriptionLbl" runat="server" />
    </p>
    
    namespace WebDemo
    {
        public partial class MoviePanel : System.Web.UI.UserControl
        {
            public int myMovieID { get; set; }
            public string myMovieName { get; set; }
            public string myMovieDescription { get; set; }
    
            protected void Page_Load(object sender, EventArgs e)
            {
                MovieIDLbl.Text = myMovieID.ToString();
                MovieNameLbl.Text = myMovieName;
                DescriptionLbl.Text = myMovieDescription;
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-29 08:47

    here is one way, doing it all in the code behind. I can't say this is best practice, but it's clean. You use the ItemDataBind event, cast the item to what you want, datatable, whatever, then create a new instance of the user control and add it to the repeater's control collection

    Page source

    public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var myList = new List<string>() { "one", "two", "three" };
            myRepeater.DataSource = myList;
            myRepeater.DataBind();
        }
    
        public void R1_ItemDataBound(Object Sender, RepeaterItemEventArgs e)
        {
            var items = (string)e.Item.DataItem;
            var newcontrol = (WebUserControl1)Page.LoadControl("~/WebUserControl1.ascx");
            newcontrol.myTest = items;
            myRepeater.Controls.Add(newcontrol);           
        }   
    }
    

    Page html

     <asp:Repeater ID="myRepeater"  runat="server" OnItemDataBound="R1_ItemDataBound">
        <ItemTemplate>
    
        </ItemTemplate>
    </asp:Repeater>
    

    user control

    <h1 id="myLabel" runat="server"></h1>
    

    and

    public partial class WebUserControl1 : System.Web.UI.UserControl
    {
        public string myTest { get; set; }
        protected void Page_Load(object sender, EventArgs e)
        {
            myLabel.InnerText = myTest;
        }
    }
    
    0 讨论(0)
提交回复
热议问题