Autopostback работает только впервые в ASP.NET? - PullRequest
4 голосов
/ 29 марта 2012

Здесь я использую переключатель для вычисления разницы дат между двумя текстовыми полями, и я показываю его в другом текстовом поле. Он работает только в первый раз, когда я нажимаю переключатель, после этого он не работает .. Вотмой код

<asp:RadioButton ID="rdoSpecifiedDates"  runat="server" class="bodycontent"   GroupName="status"/>
<asp:RadioButton ID="rdoDateRange" runat="server" class="bodycontent" 
GroupName="status"  oncheckedchanged="rdoDateRange_CheckedChanged" AutoPostBack="true"
/>

 <asp:UpdatePanel ID="Update" runat="server">
 <ContentTemplate>
 <asp:TextBox ID="txtDays" runat="server" CssClass="bodycontent" MaxLength="6" ReadOnly="true"></asp:TextBox>
 </ContentTemplate>
 <Triggers>
 <asp:AsyncPostBackTrigger ControlID="rdoDateRange" />
 </Triggers>
 </asp:UpdatePanel>

и

protected void rdoDateRange_CheckedChanged(object sender, EventArgs e)
        {
            DateTime startdate=Convert.ToDateTime(txtOStartDate.Text);
            DateTime enddate=Convert.ToDateTime(txtOEndDate.Text);
            var result = (enddate - startdate).TotalDays;
            txtDays.Text =Convert.ToString( result);
        }

Есть предложения?

Ответы [ 3 ]

4 голосов
/ 29 марта 2012

это происходит потому, что вы принудительно отправляете сообщение только в rdoDateRange ... и при нажатии других rdoSpecifiedDates не происходит никакой обратной передачи, поэтому ваша доза rdoDateRange не отражает изменений ..

Так что сделайте rdoSpecifiedDates AutoPostBack = true.

хм ... либо вы должны поместить обе кнопки rdobutton в ваш триггер .. как это

   <asp:RadioButton ID="rdoSpecifiedDates" runat="server" AutoPostBack="true" class="bodycontent" GroupName="status" />
        <asp:RadioButton ID="rdoDateRange" runat="server" class="bodycontent" GroupName="status"
            OnCheckedChanged="rdoDateRange_CheckedChanged" AutoPostBack="true" />
        <asp:UpdatePanel ID="Update" runat="server">
            <ContentTemplate>
                <asp:TextBox ID="txtDays" runat="server" CssClass="bodycontent" MaxLength="6" ReadOnly="true"></asp:TextBox>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="rdoDateRange" />
                <asp:AsyncPostBackTrigger ControlID="rdoSpecifiedDates" />
            </Triggers>
        </asp:UpdatePanel>

OR

Поместите обе кнопки-переключатели в панель обновления, как это ..

<asp:UpdatePanel ID="Update" runat="server">
            <ContentTemplate>
                <asp:RadioButton ID="rdoSpecifiedDates" runat="server" AutoPostBack="true" class="bodycontent"
                    GroupName="status" />
                <asp:RadioButton ID="rdoDateRange" runat="server" class="bodycontent" GroupName="status"
                    OnCheckedChanged="rdoDateRange_CheckedChanged" AutoPostBack="true" />
                <asp:TextBox ID="txtDays" runat="server" CssClass="bodycontent" MaxLength="6" ReadOnly="true"></asp:TextBox>
            </ContentTemplate>
            <Triggers>
                <asp:AsyncPostBackTrigger ControlID="rdoDateRange" />                
            </Triggers>
        </asp:UpdatePanel>
2 голосов
/ 29 марта 2012

Вы также можете сделать ..:

<div>

   <asp:RadioButton ID="rdoSpecifiedDates" runat="server" class="bodycontent" 
    GroupName="status" oncheckedchanged="rdoSpecifiedDates_CheckedChanged" AutoPostBack="true" />
    <asp:RadioButton ID="rdoDateRange" runat="server" class="bodycontent" GroupName="status"
        OnCheckedChanged="rdoDateRange_CheckedChanged" AutoPostBack="true" />

 <asp:ScriptManager ID="ScriptManager1" runat="server" />   
    <asp:UpdatePanel ID="Update1" runat="server" UpdateMode="Conditional" >

            <ContentTemplate>
                <asp:TextBox ID="txtDays" runat="server" CssClass="bodycontent" MaxLength="6" Enable="False"></asp:TextBox>
            </ContentTemplate>
        </asp:UpdatePanel>

    </div>

И

protected void rdoDateRange_CheckedChanged(object sender, EventArgs e)
        {
            DateTime startdate = DateTime.Now.AddHours(2);
            DateTime enddate = DateTime.Now.AddHours(5);
            TimeSpan  result = enddate - startdate;
            txtDays.Text = result.ToString();
            Update1.Update();
        }
 protected void rdoSpecifiedDates_CheckedChanged(object sender, EventArgs e)
        {

        }
1 голос
/ 19 февраля 2015

Если ваши переключатели находятся за пределами панели обновления (и должны быть), выбранный / проверенный элемент никогда не сработает из-за отсутствия JavaScript на его теге <input>, что логично в том смысле, что Страница думает, что элемент уже выбран, так почему он должен запускаться обратно на сервер при щелчке по нему?

Но это, очевидно, вызывает проблемы в этом сценарии, потому что, как триггеры для панели обновления, он никогда не «перерисовывает» себя, чтобы отразить, что выбранный элемент изменился.

Мой обходной путь для этого состоит в том, чтобы "перекрасить" переключатели, также имея их в их собственном <asp:UpdatePanel> контроле:

<asp:UpdatePanel ID="RadioButtonUpdate" runat="server">
    <ContentTemplate>
        <asp:RadioButton ID="rdoSpecifiedDates"  runat="server" class="bodycontent"
            GroupName="status" OnCheckedChanged="rdoSpecifiedDates_CheckedChanged" AutoPostBack="true" />
        <asp:RadioButton ID="rdoDateRange" runat="server" class="bodycontent" 
            GroupName="status"  OnCheckedChanged="rdoDateRange_CheckedChanged" AutoPostBack="true" />
    </ContentTemplate>
</asp:UpdatePanel>

<asp:UpdatePanel ID="Update" runat="server">
    <ContentTemplate>
        <asp:TextBox ID="txtDays" runat="server" CssClass="bodycontent" MaxLength="6" ReadOnly="true"></asp:TextBox>
    </ContentTemplate>
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="rdoDateRange" />
    </Triggers>
</asp:UpdatePanel>

Мне кажется, что это самое чистое решение за пределами установки радиокнопок на панели обновления, которую вы хотите обновить.

...