用户控制在中继器内

我在转发器中有一个UserControl。 转发器的数据源来自SQL Server。

用户控件的.cs – MoviePanel.ascx.cs:


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; } 

ASPX页面:


   <uc1:MovieDetailPanel runat="server" myMovieID='' myMovieName='' myMovieDescription='' id="MovieDetailPanel1" /> <asp:Label ID="Label1" runat="server" Text=''> <asp:Label ID="Label2" runat="server" Text=''> <asp:Label ID="Label3" runat="server" Text=''>   

这里发生了一件很奇怪的事 值未传递给UserControl。 但是,如果我将标签放在usercontrol下面并使用Eval()设置文本就可以了。 您可能认为用户控件可能是问题所在。 但是,如果我手动输入内容,代替它将被传递给用户控件并显示。

我没有线索! 如果问题出在Eval()标签上也不应该得到文本。 或者如果问题出在UserControl上,我的手册文本不应该通过。 我不知道为什么Eval()的值没有达到UserControl。

你的代码工作正常; 我测试了它(见页面底部)。 最糟糕的情况是,您可以尝试在ItemDataBound事件中分配这些值。

      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 { 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; } } 

在此处输入图像描述

以下是我测试原始问题的方法

 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebDemo.WebForm1" %> <%@ Register src="MoviePanel.ascx" tagname="MoviePanel" tagprefix="uc1" %>       
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 { 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" %>

Inside Control:

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; } } }

这是一种方法,在后面的代码中完成所有操作。 我不能说这是最好的做法,但它很干净。 您使用ItemDataBind事件,将项目转换为您想要的,datatable,等等,然后创建用户控件的新实例并将其添加到转发器的控件集合

页面来源

 public partial class _Default : Page { protected void Page_Load(object sender, EventArgs e) { var myList = new List() { "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); } } 

页面HTML

      

用户控制

 

 public partial class WebUserControl1 : System.Web.UI.UserControl { public string myTest { get; set; } protected void Page_Load(object sender, EventArgs e) { myLabel.InnerText = myTest; } }