触发SelectedIndexChanged事件,但列表框的autopostback属性为false - ASP.NET

时间:2010-11-01 06:17:44

标签: asp.net listbox updatepanel

我正在使用更新面板。在此更新面板中,有一个列表框控件。我实际上在后面的代码中将autopostback属性设置为false。但是,如果更改了所选索引,它仍会执行SelectedIndexChanged事件。

为什么会这样?

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

                                            <asp:MultiView ID="mvForms" runat="server" ActiveViewIndex="1">
                                                <asp:View ID="View1" runat="server">
                                                     <asp:Panel ID="Panel5" runat="server" GroupingText="Available Evaluation Forms" meta:resourcekey="rsKey_panel5"
                                                     Width="100%">
                                                         <asp:ListBox ID="lbAvailableForms" runat="server" AutoPostBack="true"
                                                             style="height: 125px; width: 95%;" 
                                                             onselectedindexchanged="lbAvailableForms_SelectedIndexChanged"></asp:ListBox>
                                                      </asp:Panel>
                                                </asp:View>
                                                <asp:View ID="View2" runat="server">
                                                     <asp:Panel ID="Panel11" runat="server" GroupingText="Available Evaluation Forms" meta:resourcekey="rsKey_panel11"      Width="100%">
                                                        <div  style="height: 125px; width: 95%; text-align:center;">
                                                            <br />
                                                            <br />
                                                            <asp:Label ID="lblAllSelected" runat="server" Text="All Selected" meta:resourcekey="rsKey_lblAllSelected"></asp:Label></div>
                                                    </asp:Panel>
                                                </asp:View>
                                            </asp:MultiView>
                               </ContentTemplate>
                             <Triggers>      
                           <asp:AsyncPostBackTrigger ControlID="RLCompareParameter" EventName="SelectedIndexChanged"></asp:AsyncPostBackTrigger>          
                            <asp:AsyncPostBackTrigger ControlID="cbAllForms" EventName="CheckedChanged"></asp:AsyncPostBackTrigger>
                        </Triggers>
                      </asp:UpdatePanel>            

列表框名称是lbAvailableForms。在调试时我检查了这个列表框控件的autopostback属性,然后我发现该属性为false。它看起来如此奇怪,以及selectedindexchanged事件如何触发

这里cbAllForm是一个复选框控件,RLCompareParameter是一个radilo列表。

有时我需要获得自动回发属性是真的。所以最初我将此属性设置为true。在RLCompareParameter_SelectedIndexChanged事件下,我设置lbAvailableForms.Autopostback = false。但仍然在将属性设置为false后,列表框将触发选定的indexchanged事件

1 个答案:

答案 0 :(得分:2)

在事件处理阶段更改AutoPostBack属性可能为时已晚:UpdatePanel可能已经注册了其触发器。

我首先要在列表框中停用AutoPostBackViewState(记住AutoPostBack):

<asp:ListBox ID="lbAvailableForms" runat="server"
    AutoPostBack="False" EnableViewState="False"
    Style="height: 125px; width: 95%;"
    OnSelectedIndexChanged="lbAvailableForms_SelectedIndexChanged">
</asp:ListBox>

然后引入一个私有成员来跟踪我们想要做的事情并在事件处理程序中设置该成员:

private bool _disableAutoPostBack = false;

protected void RLCompareParameter_SelectedIndexChanged(object sender, EventArgs e)
{
    _disableAutoPostBack = true;
}

然后在PreRender阶段使用它:

protected void Page_PreRender(object sender, EventArgs e)
{
    lbAvailableForms.AutoPostBack = !_disableAutoPostBack;
}

然后希望它按原样运行,因此我们不必在ListBox上动态注册AsyncPostBackTrigger,这会很麻烦。