2013-11-22 7 views
14

मेरे पास दोहराना के अंदर UserControl है। पुनरावर्तक का डेटासोर्स SQL ​​सर्वर से है।उपयोगकर्ता नियंत्रण अंदर पुनरावर्तक

उपयोगकर्ता नियंत्रण के .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() के साथ टेक्स्ट सेट करता हूं तो यह काम करता है। आपको लगता है कि उपयोगकर्ता नियंत्रण समस्या हो सकती है। लेकिन अगर मैं मैन्युअल रूप से कुछ टाइप करता हूं, तो <%# Eval("movieName") %> के स्थान पर कहें तो यह उपयोगकर्ता नियंत्रण में पारित हो जाता है और प्रदर्शित हो जाता है।

मेरे पास कोई संकेत नहीं है! यदि समस्या Eval() लेबल के साथ है, तो पाठ को भी पाठ नहीं मिलना चाहिए। या यदि समस्या UserControl के साथ है तो मेरा मैन्युअल टेक्स्ट पास नहीं होना चाहिए। मुझे नहीं पता कि क्यों Eval() के मान UserControl तक नहीं पहुंच रहे हैं।

+0

तुम मुझे पता है कि मैं पीछे कोड से UserControl करने के लिए मूल्यों को पारित करने के लिए माना जाता रहा हूँ तो कृपया सकते हैं? मैं पुनरावर्तक के डेटा स्रोत को असाइन कर सकता हूं लेकिन डेटास्रोत से मूल्य उपयोगकर्ता नियंत्रण में कैसे पास किए जाते हैं? – user1220169

+0

फ़ोरम साइट्स के विपरीत, हम "धन्यवाद" या "किसी भी मदद की सराहना नहीं करते हैं", या हस्ताक्षर [so] का उपयोग नहीं करते हैं। देखें "[चाहिए 'हाय', 'धन्यवाद,' टैगलाइन, और नमस्कार पदों से हटा दिए जाएंगे?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -प्रमुख-से-पोस्ट) –

+0

पेज लाइफसाइकिल में किस बिंदु पर आप यह देखने के लिए जांच कर रहे हैं कि मान सेट हैं या नहीं? आप डेटा बाध्यकारी अभिव्यक्तियों का उपयोग कर रहे हैं, इसलिए उन्हें 'डेटा बाइंडिंग' चरण के दौरान सेट किया जाएगा। –

उत्तर

13

आपका कोड ठीक काम कर रहा है; मैंने इसका परीक्षण किया (पृष्ठ के नीचे देखें)। सबसे खराब मामला आप आइटमडेटाबाउंड ईवेंट के अंदर उन मानों को असाइन करने का प्रयास कर सकते हैं।

<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

हां, लेकिन आप उपयोगकर्ता नियंत्रण पर बाध्यकारी का उपयोग कैसे करते हैं? यहां आप पुनरावर्तक पर बाध्यकारी का उपयोग कर रहे हैं, लेकिन फिर उपयोगकर्ता नियंत्रण पर बाध्यकारी का उपयोग नहीं कर रहे हैं। इसके बजाए, यह कोड मैन्युअल रूप से टेक्स्ट प्रॉपर्टी सेट कर रहा है। यह सिर्फ समझ में नहीं आता है। यदि वे बाइंडिंग का उपयोग नहीं कर सकते हैं तो उपयोगकर्ता नियंत्रण का उपयोग करने का क्या मतलब है? – Rhyous

+0

@Rhyous यह हो सकता है कि ओपी कुछ अन्य व्यावसायिक तर्कों को अन्य नियंत्रणों से अलग करना चाहता है। – Win

4

यहाँ, एक ही रास्ता है परीक्षण के पीछे कोड में यह सब कर रही है। मैं नहीं कह सकता कि यह सबसे अच्छा अभ्यास है, लेकिन यह साफ है। आप ItemDataBind घटना का उपयोग करें, आप क्या चाहते करने के लिए आइटम डाली, datatable, जो कुछ भी है, तो उपयोगकर्ता नियंत्रण का एक नया उदाहरण बना सकते हैं और

पृष्ठ स्रोत पुनरावर्तक के नियंत्रण संग्रह में जोड़ना

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

पृष्ठ एचटीएमएल

<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; 
    } 
} 
संबंधित मुद्दे