2013-11-22 16 views
14

Tôi có một UserControl bên trong bộ lặp. Nguồn dữ liệu của bộ lặp lại là từ SQL Server.Điều khiển người dùng bên trong bộ lặp

User Control của 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 Page:


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

Ở đây cái gì đó rất kỳ lạ xảy ra. Các giá trị không được chuyển đến UserControl. Tuy nhiên, nếu tôi đặt Nhãn bên dưới thanh điều khiển người dùng và đặt văn bản với Eval() thì nó hoạt động. Bạn có thể nghĩ rằng điều khiển người dùng có thể là vấn đề. Nhưng nếu tôi tự gõ một cái gì đó, nói thay vì <%# Eval("movieName") %> nó được truyền cho người dùng điều khiển và được hiển thị.

Tôi không có CLUE! Nếu vấn đề là với Eval() Nhãn không nên nhận được văn bản là tốt. Hoặc nếu vấn đề là với UserControl văn bản thủ công của tôi không nên được thông qua. Tôi không có ý tưởng tại sao các giá trị của Eval() không đạt được UserControl.

+0

Ông có thể xin vui lòng cho tôi biết làm thế nào tôi phải vượt qua giá trị cho UserControl từ mã phía sau? Tôi có thể gán nguồn dữ liệu của bộ lặp lại nhưng làm cách nào các giá trị từ nguồn dữ liệu được truyền tới usercontrol? – user1220169

+0

Không giống như các trang web diễn đàn, chúng tôi không sử dụng "Cảm ơn" hoặc "Bất kỳ trợ giúp được đánh giá cao" hoặc chữ ký nào trên [như vậy]. Xem "[Nên 'Xin chào', 'cảm ơn', dòng giới thiệu và lời chào được xóa khỏi bài đăng không?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be –

+0

Tại thời điểm nào trong vòng đời của trang, bạn kiểm tra xem liệu các giá trị có được thiết lập không? Bạn đang sử dụng các biểu thức ràng buộc dữ liệu, vì vậy chúng sẽ được đặt trong giai đoạn 'DataBinding' –

Trả lời

13

Mã của bạn hoạt động tốt; Tôi đã thử nghiệm nó (xem dưới cùng của trang). Trường hợp xấu nhất bạn có thể thử gán giá trị đó bên trong sự kiện 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

Đây là cách tôi thử nghiệm câu hỏi ban đầu của bạn

<%@ 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

Có, nhưng làm thế nào để bạn sử dụng Binding trên User Control? Ở đây bạn đang sử dụng Binding on the Repeater, nhưng sau đó KHÔNG sử dụng Binding trên User Control. Thay vào đó, mã này được đặt thủ công thuộc tính Văn bản. Điều này không có ý nghĩa. Điểm của việc sử dụng điều khiển người dùng là gì nếu họ không thể sử dụng Binding? – Rhyous

+0

@Rhyous Có thể OP muốn tách một số logic nghiệp vụ với các điều khiển khác. – Win

4

đây là một cách, làm tất cả trong mã phía sau. Tôi không thể nói đây là thực hành tốt nhất, nhưng nó sạch sẽ. Bạn sử dụng các sự kiện ItemDataBind, đúc mục với những gì bạn muốn, DataTable, bất cứ điều gì, sau đó tạo ra một trường hợp mới của điều khiển người dùng và thêm nó vào bộ sưu tập kiểm soát của repeater

trang nguồn

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

trang html

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

    </ItemTemplate> 
</asp:Repeater> 

điều khiển người dùng

<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; 
    } 
} 
Các vấn đề liên quan