2013-11-22 2 views
14

У меня есть 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 страница:


<asp:Repeater ID="Repeater1" DataSourceID="ListOfMoviesDS" runat="server"> 
    <ItemTemplate> 
     <uc1:MovieDetailPanel runat="server" myMovieID='<%# Eval("MovieID") %>' 
      myMovieName='<%# Eval("movieName") %>' 
       myMovieDescription='<%# Eval("movieDescription") %>' 
       id="MovieDetailPanel1" /> 

     <asp:Label ID="Label1" runat="server" 
       Text='<%# Eval("MovieID") %>'></asp:Label> 
     <asp:Label ID="Label2" runat="server" 
       Text='<%# Eval("movieName") %>'></asp:Label> 
     <asp:Label ID="Label3" runat="server" 
      Text='<%# Eval("movieDescription") %>'></asp:Label> 
    </ItemTemplate> 
</asp:Repeater> 

Тут что-то очень странное происходит. Значения не передаются в UserControl. Однако, если я помещаю метки под пользовательским контролем и устанавливаю текст с Eval(), он работает. Вы можете подумать, что проблема с usercontrol может быть проблемой. Но если я вручную набираю что-то, скажем, вместо <%# Eval("movieName") %>, он переходит к пользовательскому элементу управления и отображается.

У меня нет КЛИЕНА! Если проблема связана с Eval() Ярлыки также не должны получать текст. Или если проблема связана с UserControl, мой текст руководства не должен проходить. Я не знаю, почему значения Eval() не достигают UserControl.

+0

Не могли бы вы, пожалуйста, дайте мне знать, как я должен передать значения в UserControl из кода позади? Я могу назначить источник данных ретранслятора, но как значения из источника данных передаются в usercontrol? – user1220169

+0

В отличие от сайтов форума, мы не используем «Спасибо», «Любая помощь оценена» или подписи на [so]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -removed-from-posts) –

+0

В какой момент жизненного цикла страницы вы проверяете, установлены ли значения? Вы используете выражения привязки данных, поэтому они будут установлены во время фазы «DataBinding». –

ответ

13

Ваш код работает нормально; Я проверил его (см. Нижнюю часть страницы). В худшем случае вы можете попробовать присвоить это значение внутри события ItemDataBound.

<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

Вот как я могу проверить свой вопрос

<%@ 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; 
     } 
    } 
} 
+1

Да, но как вы используете привязку к элементу управления пользователя? Здесь вы используете привязку на повторителе, но затем НЕ используйте привязку в элементе управления пользователя. Вместо этого этот код вручную устанавливает свойство Text. Это просто не имеет смысла. Какой смысл использовать пользовательские элементы управления, если они не могут использовать привязку? – Rhyous

+0

@Rhyous Возможно, OP хочет отделить некоторую бизнес-логику с другими элементами управления. – Win

4

здесь есть один способ, делая все это в коде позади. Я не могу сказать, что это лучшая практика, но она чистая. Вы можете использовать событие ItemDataBind, литая деталь, что вы хотите, DataTable, что угодно, а затем создать новый экземпляр пользовательского элемента управления и добавить его в коллекцию элементов управления ретранслятора

источник Page

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

страницы HTML

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

    </ItemTemplate> 
</asp:Repeater> 

управление пользователем

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

и

public partial class WebUserControl1 : System.Web.UI.UserControl 
{ 
    public string myTest { get; set; } 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     myLabel.InnerText = myTest; 
    } 
} 
Смежные вопросы