Как динамически создавать триггеры UpdatePanel - PullRequest
3 голосов
/ 13 марта 2012

У меня есть UpdatePanel на моей странице default.aspx, а UpdatePanel имеет заполнитель asp, также у меня есть элемент управления ascx, который является навигацией по сайту, и он создается динамически на основе данных в базе данных, каждый элемент навигации ImageButton, и каждый мой цикл в DataList имеет значение HiddenField URL для каждого соответствующего элемента управления ascx, например Value = "~ / controls / somecontrol.ascx"

Вот что я хочу / нужно сделать: Мне нужно динамически создавать триггеры для моей UpdatePanel, которая находится в default.aspx в моем элементе управления навигацией ascx, поэтому я точно хочу, чтобы каждый элемент навигации, который является «ImageButton», был триггером для этой UpdatePanel, и когда Вы нажимаете на него, он ссылается на местозаполнитель в UpdatePanel и загружает элемент управления на основе пути NavigateUrl и выполняет placeholder.Controls.Add (mycontrol).

Страница Default.aspx:

 <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:PlaceHolder ID="phMainHolder" runat="server"></asp:PlaceHolder>
        </ContentTemplate>
    </asp:UpdatePanel>
</asp:Content>

Управление ascx навигации:

<asp:DataList ID="dlnavigations" runat="server"  RepeatDirection="Horizontal" 
                onitemcommand="dlnavigations_ItemCommand" OnItemDataBound="dlnavigations_ItemDataBound">
                <ItemTemplate>                      
                    <asp:HiddenField ID="hfURL" Value='<%#Eval("strUrl")%>' runat="server" />     

                        <asp:ImageButton ID="imgTab" Width="20"   CommandArgument='<%#Eval("ID")%>'  
                            ImageUrl='<%#Eval("strIcon")%>' runat="server" />                        
                </ItemTemplate>
            </asp:DataList>


protected void dlnavigations_ItemCommand(object source, DataListCommandEventArgs e)
            {
                HiddenField hfURL = (HiddenField)e.Item.FindControl("hfURL");
                Control ctrl = LoadControl(hfURL.Value);
                myplaceholderinUpdatePanel.Controls.Clear();
                //here i need to reference my placeholder in UpdatePanel then
                myplaceholderinUpdatePanel.Controls.Add(ctrl);

            }

Я не очень уверен, если это действительно возможно сделать с UpdatePanel, пожалуйста, любую помощь, присвоенную, если я не могу сделать это с UpdatePanel, есть ли другой способ сделать эту же концепцию?

спасибо.

1 Ответ

5 голосов
/ 13 марта 2012

Если я правильно понял ваше требование, я бы предложил другой подход:

Установите свойство UpdatePanel1's UpdateMode на Conditional

<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">
    <ContentTemplate>
        <asp:PlaceHolder ID="phMainHolder" runat="server"></asp:PlaceHolder>
    </ContentTemplate>
</asp:UpdatePanel>

Для уточнения подхода , управляемого событиями немного, предположим, что это код вашего UserControl:

public partial class Navigation : System.Web.UI.UserControl
{
   public delegate void NavigationHandler(int ID);
    public event NavigationHandler Navigated;

    void LinkButton_Command(Object sender, CommandEventArgs e)
    {
        int ID=int.Parse(e.CommandArgument.ToString());
        Navigated(ID);
    }
}

И ваша страница может обработать это событие следующим образом:

protected void Page_Init(object sender, EventArgs e) {
    this.Navigation1.Navigated += UserNavigated;
}

protected void UserNavigated(int ID){
    //do whatever you need to do and then call...
    UpdatePanel1.Update();
}
...