2013-11-22 22 views
14

Tekrarlayıcı içinde bir UserControl var. Yineleyicinin veri kaynağı SQL Server'dan.Kullanıcı Kontrol İç Tekrarlayıcı

Kullanıcı denetimin .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 Sayfa:

İşte
<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> 

şey çok garip olur. Değerler UserControl'e geçirilmiyor. Ancak, Etiketleri usercontrol altına yerleştirir ve Eval() ile metni ayarlarsam çalışır. Usercontrol sorunun olabileceğini düşünebilirsiniz. Ancak elle bir şey yazıyorsam, <%# Eval("movieName") %> yerine kullanıcı kontrolüne geçilir ve görüntülenir.

NO CLUE! Sorun Eval() ile yazılmışsa, etiketler de metni almamalıdır. Ya da sorun UserControl ile ise manuel metinlerim geçmemelidir. Eval() 'ın değerlerinin neden UserControl'e ulaşmadığına dair hiçbir fikrim yok.

+0

beni Geride kodundan UserControl değer geçirmek gerekiyor nasıl bildirin lütfen? Tekrarlayıcı veri kaynağını atayabilirim fakat veri kaynağındaki değerler usercontrol'e nasıl iletilir? – user1220169

+0

Forum sitelerinin aksine, "Teşekkürler" veya "Takdir edilen herhangi bir yardım" ya da [bu nedenle] imzaları kullanmıyoruz. "['Merhaba', 'teşekkürler', 'sloganları ve selamlar yazılardan kaldırılmalı mı?] Bölümüne bakın. (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be –

+0

Sayfa yaşam döngüsünde hangi noktada değerlerin ayarlanmış olup olmadığını kontrol ediyor musunuz? Veri bağlama ifadeleri kullanıyorsunuz, böylece bunlar "DataBinding" aşamasında ayarlanacak. –

cevap

13

Sizin kodunuz düzgün çalışıyor; Test ettim (sayfanın en altına bakın). En kötü durum, bu değeri ItemDataBound olayı içinde atamayı deneyebilirsiniz. İşte

enter image description here

<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; 
    } 
} 
Kodda tüm yapıyor baştaki soru

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

Evet, ancak Kullanıcı Denetimi'nde Bağlamayı nasıl kullanırsınız? Burada Tekrarlayıcıda Bağlama kullanıyorsunuz, ancak Kullanıcı Kontrolünde Bağlama kullanmıyorsunuz. Bunun yerine, bu kod Metin özelliğini el ile ayarlıyor. Bu sadece mantıklı değil. Bağlama kullanamazlarsa Kullanıcı Denetimleri'ni kullanmanın amacı nedir? – Rhyous

+0

@Rhyous OP'nin bazı iş mantığını diğer denetimlerle ayırmak istemesi olabilir. – Win

4

burada, bir yoludur testi nasıl. Bunun en iyi uygulama olduğunu söyleyemem ama temiz. Ne istediğini öğeyi döküm, ItemDataBind olayını kullanmak, datatable, ne olursa olsun, o zaman

Sayfa Kaynak kullanıcı denetimi yeni bir örneğini oluşturmak ve tekrarlayıcı kontrol koleksiyonuna ekleme

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

Sayfa html

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

    </ItemTemplate> 
</asp:Repeater> 

kullanıcı kontrolü

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

ve

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