2008-10-17 13 views
13

Kısmi geri gönderimleri olan bir güncelleştirme panelinin içine dinamik olarak denetimler ekleme konusunda sorun yaşıyorum. Dinamik denetimlerle ilgili birçok makale okudum ve bunları geri bildirimlerle nasıl ekleyeceğinizi ve sürdüreceğimi anlıyorum, ancak bu bilgilerin çoğu geçerli değil ve kısmi geri göndermeler için çalışmayacak. Onları UpdatePanels ile eklemek ve sürdürmekle ilgili yararlı bilgiler bulamıyorum. Mümkünse bir web servisi oluşturmadan bunu yapmak istiyorum. Bazı yararlı bilgiler için herhangi bir fikir veya referans var mı?Bir Güncelleştirmeler İçinde Kullanıcı Denetimlerinin Programlı Olarak Eklenmesi

+0

Bunu yapmaya çalıştığınız kodu yükleyebilir misiniz? –

cevap

10

Sanırım, asp.net programcıları için sık karşılaşılan sorunlardan bir tanesi ama aslında ne olduğunu bildiğinizde doğru olması zor değil (her zaman sizin bakış açınızı unutmayın!). Aşağıdaki kod parçası, işlerin nasıl yapılabileceğini açıklamaktadır. Kullanıcının, güncelleme panosunun içindeki sayfaya kullanıcı denetimi ekleyecek bir eylemi tetikleyecek bir menüyü tıklayabileceği basit bir sayfadır.
(Bu kod from here ödünç ve bu konuyla ilgili birçok bilginin daha vardır)

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

ve arkasında kod

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

.

Temel olarak bu. Denetimlerin kendileri sayfaya dinamik olarak eklendiklerinde (kullanıcı bir menü maddesini tıklattığında, updatePanel içinde (aslında updatePanel öğesindeki placeHolder içinde) ViewLink'in LastLoadedControl ile tutulduğunu açıkça görebilirsiniz. sunucuya asenkron geri gönderme

fazla bilgi de burada bulunabilir.

ve tabiki the website that holds the example code burada kullanıyorum.

3

Yukarıda belirtilen yöntemi kullanan bir olayın işlenirken LoadUserControl() işlevinin iki kez çağrılmasıyla karşılaştım. Bazı diğer makalelere okudum ve sana modifikasyon göstermek istiyorum:

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

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

2) ayarlamak unutmayın:

1) yerine Page_Load Kullanımı LoadViewstate kullanıcı denetimi yüklemeye kontrol id usercontrol yüklerken:

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

bu deneyin:

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

Sen repla edebilirsiniz İstediğiniz herhangi bir HTML içeriğiyle değişmez içeriği ...

İlgili konular