2008-10-17 15 views
13

के अंदर उपयोगकर्ता नियंत्रण जोड़ना मुझे आंशिक पोस्टबैक के साथ अद्यतन पैनल के अंदर गतिशील रूप से नियंत्रण जोड़ने में समस्या हो रही है। मैंने गतिशील नियंत्रणों पर कई लेख पढ़े हैं और मैं समझता हूं कि उन्हें पोस्टबैक के साथ कैसे जोड़ना और बनाए रखना है, लेकिन इनमें से अधिकतर जानकारी लागू नहीं होती है और आंशिक पोस्टबैक के लिए काम नहीं करेगी। मुझे UpdatePanels के साथ जोड़ने और बनाए रखने के बारे में कोई उपयोगी जानकारी नहीं मिल रही है। यदि संभव हो तो मैं वेब सेवा बनाने के बिना ऐसा करना चाहता हूं। क्या किसी के पास कुछ उपयोगी जानकारी के लिए कोई विचार या संदर्भ है?प्रोग्रामेटिक रूप से एक अपडेट पैनेल

+0

क्या आप वह कोड पोस्ट कर सकते हैं जिसके साथ आप इसे करने का प्रयास कर रहे हैं? –

उत्तर

10

यह मुझे लगता है कि, एएसपीनेट प्रोग्रामर के लिए सामान्य नुकसान में से एक है, लेकिन वास्तव में यह सही नहीं है कि आपको पता चल जाए कि क्या हो रहा है (हमेशा अपना व्यूस्टेट याद रखें!)।

कोड का निम्नलिखित भाग बताता है कि चीजें कैसे की जा सकती हैं। यह एक साधारण पृष्ठ है जहां कोई उपयोगकर्ता मेनू पर क्लिक कर सकता है जो एक क्रिया को ट्रिगर करेगा जो अद्यतन पैनेल के अंदर पृष्ठ पर उपयोगकर्ता नियंत्रण जोड़ देगा।
(यह कोड from here उधार लिया जाता है, और इस विषय के विषय में बहुत सारी जानकारी का अधिक है)

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SampleMenu1.aspx.cs" Inherits="SampleMenuPage1" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title>Sample Menu</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
     <asp:Menu ID="Menu1" runat="server" OnMenuItemClick="Menu1_MenuItemClick"> 
      <Items> 
       <asp:MenuItem Text="File"> 
        <asp:MenuItem Text="Load Control1"></asp:MenuItem> 
        <asp:MenuItem Text="Load Control2"></asp:MenuItem> 
        <asp:MenuItem Text="Load Control3"></asp:MenuItem> 
       </asp:MenuItem> 
      </Items> 
     </asp:Menu> 
     <br /> 
     <br /> 
     <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> 
     <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> 
      <ContentTemplate> 
       <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder> 
      </ContentTemplate> 
      <Triggers> 
       <asp:AsyncPostBackTrigger ControlID="Menu1" /> 
      </Triggers> 
     </asp:UpdatePanel> 
    </form> 
</body> 
</html> 

और

using System; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class PlainSampleMenuPage : System.Web.UI.Page 
{ 
    private const string BASE_PATH = "~/DynamicControlLoading/"; 

    private string LastLoadedControl 
    { 
     get 
     { 
      return ViewState["LastLoaded"] as string; 
     } 
     set 
     { 
      ViewState["LastLoaded"] = value; 
     } 
    } 

    private void LoadUserControl() 
    { 
     string controlPath = LastLoadedControl; 

     if (!string.IsNullOrEmpty(controlPath)) 
     { 
      PlaceHolder1.Controls.Clear(); 
      UserControl uc = (UserControl)LoadControl(controlPath); 
      PlaceHolder1.Controls.Add(uc); 
     } 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     LoadUserControl(); 
    } 

    protected void Menu1_MenuItemClick(object sender, MenuEventArgs e) 
    { 
     MenuItem menu = e.Item; 

     string controlPath = string.Empty; 

     switch (menu.Text) 
     { 
      case "Load Control2": 
       controlPath = BASE_PATH + "SampleControl2.ascx"; 
       break; 
      case "Load Control3": 
       controlPath = BASE_PATH + "SampleControl3.ascx"; 
       break; 
      default: 
       controlPath = BASE_PATH + "SampleControl1.ascx"; 
       break; 
     } 

     LastLoadedControl = controlPath; 
     LoadUserControl(); 
    } 
} 
पीछे कोड के लिए

यह मूल रूप से यह है। आप स्पष्ट रूप से देख सकते हैं कि व्यूस्टेट LastLoadedControl के साथ रखा जा रहा है, जबकि नियंत्रण पृष्ठ में गतिशील रूप से जोड़े गए हैं (अपडेट पैनेल के अंदर (वास्तव में अपडेट पैनेल के अंदर होल्डर के अंदर) जब उपयोगकर्ता मेनू आइटम पर क्लिक करता है, जो एक भेज देगा सर्वर से अतुल्यकालिक पोस्टबैक

अधिक जानकारी भी यहां पाया जा सकता:।

और निश्चित रूप से the website that holds the example code पर मैंने यहां उपयोग किया।

3

मुझे समस्या का सामना करना पड़ा है कि ऊपर उल्लिखित विधि का उपयोग करके, LoadUserControl() को किसी ईवेंट को संभालने पर दो बार बुलाया जाता है। मैं कुछ अन्य लेख पढ़ने के बाद आप मेरी संशोधन को दिखाने के लिए करना चाहते हैं:

protected override void LoadViewState(object savedState) 
{ 
    base.LoadViewState(savedState); 

    if (!string.IsNullOrEmpty(CurrentUserControl)) 
     LoadDataTypeEditorControl(CurrentUserControl, panelFVE); 
} 

2) भूल जाते हैं स्थापित करने के लिए नहीं है:

1) Page_Load के बजाय LoadViewstate उपयोग उपयोगकर्ता नियंत्रण लोड करने के लिए नियंत्रण आईडी जब usercontrol लोड हो रहा है:

private void LoadDataTypeEditorControl(string userControlName, Control containerControl) 
{ 
    using (UserControl myControl = (UserControl) LoadControl(userControlName)) 
    { 
     containerControl.Controls.Clear(); 

     string userControlID = userControlName.Split('.')[0]; 
     myControl.ID = userControlID.Replace("/", "").Replace("~", ""); 
     containerControl.Controls.Add(myControl); 
    } 
    this.CurrentUserControl = userControlName; 
} 
3

इस प्रयास करें:

Literal literal = new Literal(); 
literal.Text = "<script type='text/javascript' src='http://www.googleadservices.com/pagead/conversion.js'>"; 
UpdatePanel1.ContentTemplateContainer.Controls.Add(literal); 

आप repla कर सकते हैं किसी भी एचटीएमएल सामग्री के साथ शाब्दिक की सामग्री को सीई ...

संबंधित मुद्दे