2015-03-10 2 views
2

Я хочу создать пользовательский элемент управления, представляющий индикатор выполнения.asp.net updatepanel внутри usercontrol перезагрузить весь элемент управления

ASCX:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ProgressBar.ascx.cs" Inherits="A2Controls.Controls.ProgressBar" %> 

<div class="progress"> 
    <div class="progress-bar" role="progressbar" aria-valuenow="<%# this.Value %>" aria-valuemin="0" aria-valuemax="100" style="width: <%# this.Value %>%"> 
     <span class="sr-only"><%# this.Value %> Complete</span> 
    </div> 
</div> 

Код За:

public partial class ProgressBar : System.Web.UI.UserControl 
{ 
    public int Value { get; set; } 

    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
} 

ASPX:

<asp:UpdatePanel runat="server"> 
    <ContentTemplate> 
     <asp:Timer runat="server" ID="clock" OnTick="clock_Tick" Interval="1000" Enabled="true"></asp:Timer> 
     <uc1:ProgressBar runat="server" ID="ProgressBar" /> 
    </ContentTemplate> 
    <Triggers > 
     <asp:AsyncPostBackTrigger ControlID="clock" EventName="Tick" /> 
    </Triggers> 
</asp:UpdatePanel> 

Код За:

protected void clock_Tick(object sender, EventArgs e) 
{ 
    this.ProgressBar.Value++; 
} 

Проблема заключается в том, что каждый раз, когда функция клещ называется, то UpdatePanel refreh и перезагружать весь UserControl (вызов конструктора я имею в виду)! Я попытался поместить логику updatepanel внутри usercontrol, но нет никакой разницы.

Как я могу предотвратить повторное создание экземпляра usercontrol?

+0

Вы имеете в виду, что каждый раз, когда свойство «Value» сбрасывается на 0? – dario

+0

не только это, но если я объявляю конструктор, и я ставлю точку останова, я вижу, что это ударяется каждый раз, когда я обновляю панель обновления. Так что если я сделаю что-то вроде этого prgBar.Value = 50; uPanel.Update(); (или подождите, пока таймер «отметит») Создан новый ProgressBar. –

ответ

1

Вы должны изменить свое Value свойство это:

public int Value 
{ 
    get 
    { 
     if (ViewState["Value"] != null) 
      return (int)ViewState["Value"]; 
     else 
      return 0; 
    } 
    set 
    { 
     ViewState["Value"] = value; 
    } 
} 

Таким образом, вы сохраняете значение свойства через постбэков.

HTTP - это протокол без гражданства. К сожалению, вам нужно использовать какой-то трюк, чтобы сохранять данные во всех запросах типа ViewState. Вам лучше посмотреть here и here, чтобы понять, что здесь нет ничего плохого.

+0

Хорошо, это трюк, но я не понимаю, почему. Я имею в виду, если я модифицирую элемент управления из внутреннего, я ожидаю, что тот же самый момент сохранится, и будет вызван только метод «Render». Есть много вещей, которые я пытался сделать, но это действительно сложно, если каждый раз контроль полностью перестраивается! –

+0

'HTTP' - это протокол без учета состояния. К сожалению, вам нужно использовать какой-то трюк, чтобы сохранять данные по таким запросам, как 'ViewState'. Вам лучше посмотреть [здесь] (https://msdn.microsoft.com/en-us/library/ms972976.aspx) и [здесь] (https://msdn.microsoft.com/en-us/library/ ms178472% 28v = vs.85% 29.aspx), чтобы понять, что здесь нет ничего плохого. – dario

+0

В любом случае, посмотрите [здесь] (http://stackoverflow.com/help/someone-answers). – dario

Смежные вопросы