Динамический Control в UpdatePanel

UpdatePanel лучше не применять, точнее пользы от него особой нет… трафик между клиентом и сервером меньше, но все-таки много трафика идет в запросе к серверу, так как передается ViewState и прочее.
 
Но зато как просто и удобно создать с ним приложения! Что я сейчас и делаю, мне надо сделать некий прототип приложения и UpdatePanel идеально для этого подходит.
 
Одна из первых проблем это создание динамических UserControl и добавление их в UpdatePanel. Я приведу небольшой код который может пригодится тем кто столкнется с такойже задачей. По сути это ничем не отличается от обычного поведения страницы, без всякого AJAX.
 
Задача состоит в том чтобы через LoadControl добавлять в UpdatePanel свои элементы и потом с ними работать, но так как они динамические, то для их работы требуются дополнительные действия. Здесь я привожу код который у меня работает, все очень просто, текущий контрол сохраняется в ViewState.
 
 
Страница
Default.aspx
 
<form id="form1" runat="server">
        <ajaxToolkit:ToolkitScriptManager ID="ScriptManager1" runat="server" />
        <div>
            <asp:UpdatePanel runat="server" ID="UPContent">
                <ContentTemplate>
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />
                </Triggers>
            </asp:UpdatePanel>
            <asp:UpdatePanel runat="server" ID="UPTwo" UpdateMode="Conditional">
                <ContentTemplate>
                    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
                </ContentTemplate>
            </asp:UpdatePanel>
        </div>
    </form>
 
 
Default.aspx.cs
 
protected void Page_Load(object sender, EventArgs e)
    {
 
        if (ScriptManager1.IsInAsyncPostBack)
        {
            LoadControl();
        }
 
    }
 
    public string CurrentControl
    {
        get
        {
            return ViewState["CurrentControl"] == null ? "WebUserControl2.ascx" : (string)ViewState["CurrentControl"];
        }
        set
        {
            ViewState["CurrentControl"] = value;
        }
    }
 
    void LoadControl()
    {
        Control ctl = LoadControl(CurrentControl);
        ctl.ID = "UserControl1";
        UPContent.ContentTemplateContainer.Controls.Clear();
        UPContent.ContentTemplateContainer.Controls.Add(ctl);
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        CurrentControl = "WebUserControl.ascx";
        LoadControl();
    }
 
 
Контролы
 
WebUserControl.aspx
 
 
<asp:UpdatePanel ID="UpdatePanelUserControl1" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>&nbsp;
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
        <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    </ContentTemplate>
</asp:UpdatePanel>
 
 
WebUserControl.aspx.cs
 
 
protected void Page_Load(object sender, EventArgs e)
    {
       
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Label1.Text = TextBox1.Text + DateTime.Now;
    }
 
 
WebUserControl2.ascx пустой контрол нужен только для понимания работы.

14 июня 2007 г. 16:44

Комментарии

# re: Динамический Control в UpdatePanel

09.08.2007 0:16 | Baks

решил проверить, как работает твой код.
самая простая проверка - сделать контрол, который грузит в себя себя самого.

но вот не получилось так...

и вообще.. зачем вызывать LoadControl() 2 раза?

ещё мне очень уж не понравился кусок

if (ScriptManager1.IsInAsyncPostBack)
{
LoadControl();
}

а вдруг это другой AsyncPostBack. ну т.е. не тот, который контрол должен создавать..

# re: Динамический Control в UpdatePanel

17.08.2007 11:59 | Ковалев Антон

Согласен, код не идеален, но основную функцию свою он выполняет...

# re: Динамический Control в UpdatePanel

19.08.2007 22:32 | chinga

А зачем делать loadcontrol?
Например пробовал делать так Button mybut = new Button();
UpdatePanel.controls.add(mybut);

всмысле я начинающий программист потму стправшиваю есть ли в моем методе какие либо ошибки?

# re: Динамический Control в UpdatePanel

05.09.2007 3:39 | Baks

долго мудрил с твои кодом... потом забил... не работает так как надо... ды вообще говоря я так и не понял чего он полузного делает...

если на забуду вышлю код, который позволяет динамический добавлять контролы без касяков. т.е. ответ на мой первый вопрос. :) я делал контрол, который грузить в себя что угодно. даже себя самого.

P.S. совершенно случайно вновь наткнулся на эту страничку :)

# re: Динамический Control в UpdatePanel

05.09.2007 3:44 | Baks

chinga, суть в том что динамическая кномпа это, конечно, хорошо. но в большинстве случаев надо подгрузить свой UserControl (в котором может быть к примеру n кнопок, m эдитов и целых k чебоксов)

P.S. можно было написать проще UdatePanel.controls.add(new Button()); :)
правда так отлаживать не удобно..

Добавить комментарий






 
Copyright © Антон Ковалев