各位高手,小弟最近开发页面时遇到这样一个问题。用AjaxToolkit中的Dropdown之后,觉得挺好用的,只不过在Demo中下拉列表的Panel中,是写死的几个linkbutton,同时在下面注册了updatepanel,响应这几个linkbutton。我修改了一下,把这些写死的linkbutton用Repeater来展现,只不过在后台添加了AsyncPostBackTrigger后,前台页面依旧是postback的,不知道有什么问题。主要代码如下
页面上
                <asp:Label ID="TextLabel" runat="server" Text="Select your favorite exotic ice-cream flavor"
                    Style="display: block; width: 300px; padding: 2px; padding-right: 50px; font-family: Tahoma;
                    font-size: 11px;" />
                <asp:Panel ID="DropPanel" runat="server" CssClass="ContextMenuPanel" Style="display: none;
                    visibility: hidden;">
                    <asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1" OnItemDataBound="ItemDataBound">
                        <ItemTemplate>
                            <asp:LinkButton ID="lnk" runat="server" Text='<%# Bind("DisplayName") %>' CssClass="ContextMenuItem"
                                OnClick="OnSelect" />
                        </ItemTemplate>
                    </asp:Repeater>
                </asp:Panel>
                <ajaxToolkit:DropDownExtender runat="server" ID="DDE" TargetControlID="TextLabel"
                    DropDownControlID="DropPanel" />
                <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:connStr %>"
                    SelectCommand="SELECT [DisplayName], [UserCode], [FullName] FROM [plat_Users]">
                </asp:SqlDataSource>
        <asp:UpdatePanel ID="Update" runat="server">
            <ContentTemplate>
                <br />
                <asp:Label ID="lblSelection" runat="server" Style="padding: 5px;" />
            </ContentTemplate>
        </asp:UpdatePanel>后台主要有以下代码
    protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        foreach (RepeaterItem item in this.Repeater1.Items)
        {
            AsyncPostBackTrigger tr = new AsyncPostBackTrigger();            LinkButton lk = (LinkButton)(item.FindControl("lnk"));
            if (lk != null)
            {
                tr.ControlID = lk.ClientID;
                tr.EventName = "Click";
                this.Update.Triggers.Add(tr);
            }        }
    }
另:如果updatepanel包括整个repeater则同样可以实现该效果,不过如果能用代码解决这个问题的话,我觉得还是这样比较好。不知道有谁遇到过这样的情况吗?

解决方案 »

  1.   

                    <asp:Label ID="TextLabel" runat="server" Text="Select your favorite exotic ice-cream flavor"
                        Style="display: block; width: 300px; padding: 2px; padding-right: 50px; font-family: Tahoma;
                        font-size: 11px;" />
                    <asp:Panel ID="DropPanel" runat="server" CssClass="ContextMenuPanel" Style="display: none;
                        visibility: hidden;">
                        <asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1" OnItemDataBound="ItemDataBound">
                            <ItemTemplate>
                                <asp:LinkButton ID="lnk" runat="server" Text=' <%# Bind("DisplayName") %>' CssClass="ContextMenuItem"
                                    OnClick="OnSelect" />
                            </ItemTemplate>
                        </asp:Repeater>
                    </asp:Panel>
                    <ajaxToolkit:DropDownExtender runat="server" ID="DDE" TargetControlID="TextLabel"
                        DropDownControlID="DropPanel" />
                    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString=" <%$ ConnectionStrings:connStr %>"
                        SelectCommand="SELECT [DisplayName], [UserCode], [FullName] FROM [plat_Users]">
                    </asp:SqlDataSource>
            <asp:UpdatePanel ID="Update" runat="server">
                    <Triggers>
                        <asp:AsyncPostBackTrigger ControlID="Repeater1" EventName="ItemCommand" />
                    </Triggers>
                <ContentTemplate>
                    <br />
                    <asp:Label ID="lblSelection" runat="server" Style="padding: 5px;" />
                </ContentTemplate>
            </asp:UpdatePanel> 
      

  2.   

    后代代码里Repeater1_ItemDataBound事件处理可以去掉