Gridview标题问题:标题上的调用事件

时间:2010-04-23 11:39:58

标签: c# asp.net gridview header

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

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

Gridview:

<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>

2 个答案:

答案 0 :(得分:1)

这是老代码介意你。它可以进行优化。

http://weblogs.asp.net/rajbk/archive/2006/08/04/Clickable-GridView-Headers.aspx

答案 1 :(得分: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;');
});

基本上,它从ASP.NET放置在标题中的链接中删除了javascript,看起来像这样

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

并将代码放入标题的click事件中。然后它禁用链接,以便事件冒泡不会导致冲突。

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

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

希望这适合你!

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

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

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

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