【问题标题】:ASP.NET DropDownList control in GridView causes Full postback on SelectedIndexChanged eventGridView 中的 ASP.NET DropDownList 控件导致 SelectedIndexChanged 事件的完全回发
【发布时间】:2011-01-26 22:48:52
【问题描述】:

我在更新面板内的 gridview 中有一个下拉列表控件 (SourceDD),每次单击下拉列表时,都会触发 OnSelectedIndexChanged 事件。但在此之前,它会进行完整的回发并运行整个 Page_Load 代码,这不是我想要的。基本上我希望它只运行 OnSelectedIndexChanged 事件,仅此而已,不会导致完整的回发。在我的事件中,我只是根据他们在 SourceDD 中所做的选择启用/禁用下一列(SymbolDD),因此事件代码中没有什么特别之处。如果有办法不在包含网格视图的更新面板内进行完整回发,请 lmk。非常感谢...

<asp:UpdatePanel ID="TestsPanel" runat="server" Visible="true" UpdateMode="Conditional" EnableViewState="false" ChildrenAsTriggers="true">
                <ContentTemplate>                   <asp:GridView ID="TestGridView" runat="server" Visible="true" CssClass="GridViewRows" AlternatingRowStyle-CssClass="TableRowEven"
                     AutoGenerateColumns="false">
                    <HeaderStyle CssClass="TableHead" />
                      <Columns>                                                         
                            <asp:TemplateField Headertext="Source">
                                    <ItemTemplate>                                   
                                        <asp:DropDownList runat="server" ID="SourceDD" AutoPostBack="true" OnSelectedIndexChanged="SourceDD_SelectedIndexChanged">
                                        </asp:DropDownList>                                                                                        
                                    </ItemTemplate>                                
                            </asp:TemplateField>                                 
                            <asp:TemplateField Headertext="Symbol">
                                    <ItemTemplate>                                   
                                        <asp:DropDownList runat="server" ID="SymbolDD">
                                        </asp:DropDownList>                                            
                                    </ItemTemplate>                                
                            </asp:TemplateField>                         
                        </Columns>                    
                    </asp:GridView>                        
                    </ContentTemplate>

【问题讨论】:

    标签: asp.net-ajax


    【解决方案1】:

    如果您不希望回发,请使用 javascript/ajax 处理该事件,或者尝试修复您的代码以正确处理部分回发。

    试试这些链接: http://encosia.com/2007/07/11/why-aspnet-ajax-updatepanels-are-dangerous/ http://www.asp.net/ajax/tutorials/understanding-partial-page-updates-with-asp-net-ajax

    【讨论】:

    • 这就是我要问的,如何避免以 javascript 或其他方式进行完整回发?我是 javascript 新手,所以我不知道从哪里开始...谢谢!
    【解决方案2】:

    我同意达斯汀的观点。使用 javascript,您必须将其放在控件的 GridViewRowDataBound 事件中,以便启用正确的控件。

    类似

    RowDatabound(object sender, GridViewRowEventArgs  e)
    {
       ((DropDownList)e.FindControl("SourceDD")).Attributes("onchange", <onchangelogic>);
       //use something like "document.getElementById('" +(DropDownList)e.FindControl("SymbolDD")).ClientID + "').enabled = true;"
       //or maybe it was .disabled = false....
    }
    

    【讨论】:

      【解决方案3】:

      其实这个问题是有解决办法的。您可以将 UpdatePanel 添加到 GridView 的 TemplateField 的 ItemTemplate 并将您的 DropDownList 添加到此 UpdatePanel。然后为 DropDownList "SelectedIndexChanged" 事件添加 AsyncPostBackTrigger。这确保了在 DropDownList 的选定项目更改时发生的回发是部分的(即整个页面不会刷新)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        • 2010-10-08
        相关资源
        最近更新 更多