【问题标题】:Gridview header issue: call event on headerGridview标题问题:标题上的调用事件
【发布时间】:2010-04-23 11:39:57
【问题描述】:

现在我得到了这个 gridview,我需要标题是可点击的,然后事件开始(类似于 OnClickHeader="header_ClickEvent"?)当然有一个 SortExpression 元素,可以对网格进行排序,但我想能够启动任何事件,例如单击按钮时。

我在 asp:BoundField 和 asp:TemplateField 中找不到任何解决方案... 我认为超链接可以解决问题,但这有点为时过早。 此外,在使用 TemplateField 时,我发现很难用数据填充列。 谁能给我解决方案?

网格视图:

<asp:GridView CssClass="gridview" ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="Student_key" OnSelectedIndexChanged="GridView1_SelectedIndexChanged" PagerSettings-Visible="false" PageSize="14">

                                    <HeaderStyle CssClass="headerstyle" />
                                    <RowStyle CssClass="rowstyle"/>
                                    <AlternatingRowStyle CssClass="altrowstyle" />
                                    <Columns>
                                        <asp:BoundField DataField="Studentnumber" HeaderText="Studentnummer" >
                                            <HeaderStyle CssClass="header100" />
                                        </asp:BoundField>
                                        <asp:BoundField DataField="Prefix" HeaderText="Voorletters" >
                                            <HeaderStyle CssClass="header75" />
                                        </asp:BoundField>
                                        <asp:BoundField DataField="prename" HeaderText="Voornaam" SortExpression="Voornaam">
                                            <HeaderStyle CssClass="header75" />
                                        </asp:BoundField>
                                        <asp:BoundField DataField="nickname" HeaderText="Roepnaam" >
                                            <HeaderStyle CssClass="header100" />
                                        </asp:BoundField>
                                        <asp:BoundField DataField="insertion" HeaderText="Tussenvoegsel" >
                                            <HeaderStyle CssClass="header100" />
                                        </asp:BoundField>
                                        <asp:BoundField DataField="surname" HeaderText="Achternaam">
                                            <HeaderStyle CssClass="header100" />
                                        </asp:BoundField>
                                        <asp:CommandField SelectText="show results" ShowSelectButton="True" >
                                            <HeaderStyle CssClass="header100" />
                                        </asp:CommandField>

                                    </Columns>
                                    <EmptyDataTemplate >There are no results shown, please try again.</EmptyDataTemplate>

                                </asp:GridView>

【问题讨论】:

    标签: c# asp.net gridview header


    【解决方案1】:

    有趣的是,我今天也遇到了同样的问题,和你一样,我发现上面的解决方案有点多。

    这是我很满意的事情。

    首先,您需要使用CSS Friendly Control adapters。如果您使用的是 GridView 并且您有任何类,那么这还有很多其他好处。在这种情况下需要它,因为它根据排序属性将必要的类添加到您的标题中,而 ASP.NET 没有。

    您无需更改任何代码即可添加适配器,只需将它们的 DLL 放在您的 bin 文件夹中,并将它们的 .browser 文件放在您的 App_Browsers 文件夹中(您可能需要为此添加)。

    (在一个边节点上,我实际上发现适配器破坏了我的其他一些控件布局(它们的样式与默认的 ASP.NET 标记相对应),所以我撕掉了除 GridView 之外的所有适配器标签。)

    <browser refID="Default">
        <controlAdapters>
            <adapter controlType="System.Web.UI.WebControls.GridView"
                     adapterType="CSSFriendly.GridViewAdapter" />
        </controlAdapters>
    </browser>
    

    现在,进入好的部分。在您的 document.ready 事件中的这一点 jQuery 将产生预期的效果。

    // Make the entire column header clickable, not just the text
    $('#your-table thead th.sortable').each( function() {
        var href = $('a', this).attr('href');
        $(this).click( new Function(href.replace(/^javascript:/, '')) );
        $('a', this).attr('href', 'javascript: return false;');
    });
    

    基本上,它将 javascript 从 ASP.NET 放置在标头中的链接中剥离出来,如下所示

    <a href="javascript:__doPostBack('ctl00$Form$id','Sort$Quantity')">Qty</a>
    

    并将代码放入标头的click 事件中。然后它禁用链接,这样事件冒泡就不会引起冲突。

    当然,您需要添加样式规则以提供所需的视觉提示。

    这个解决方案可以很好地降级,因为那些神话般的非 JavaScript 浏览器只会表现出默认行为(您必须点击标题文本)。

    希望这对你有用!

    编辑:我刚刚意识到我第一次没有仔细阅读您的问题。我的代码旨在在您单击标题中的任意位置(不仅仅是链接文本)时获得默认的排序行为。但我想这已经足够接近了:)

    顺便说一句,要将数据放入类似于 ASP.NET 的模板字段中,您只需添加

    <ItemTemplate>
        <%# Eval("FieldName") %>
    </ItemTemplate>
    

    请参阅有关格式化等的文档。

    【讨论】:

    • 哇,这当然需要我做一些研究:) 谢谢!顺便说一句,这个解决方案对服务器端属性有影响吗?我的意思是,标准的 asp 和 SQLserver 安装是否足够? (如果我错了,请纠正我,我对此有点绿色)
    • 它并不像看起来那么糟糕 :) 对我来说,这只是添加 jQuery 的问题,因为我已经设置了控制适配器。这些将更改服务器生成的标记,但通常会更好。特别是如果它是一个新项目,我建议现在就放置它们,不管标题问题如何。它将允许您使用 CSS 设置 GridView 的样式,并呈现更多符合标准的 HTML。
    【解决方案2】:

    【讨论】:

    • 啊,谢谢!我想它会完成这项工作。不过有点奇怪,真的没有简单的方法来解决这个问题吗?
    猜你喜欢
    • 2013-01-11
    • 1970-01-01
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 2012-04-30
    • 2019-12-25
    • 1970-01-01
    相关资源
    最近更新 更多