Проблема заголовка Gridview: событие вызова в заголовке - PullRequest
1 голос
/ 23 апреля 2010

Теперь у меня есть это представление сетки, и мне нужно, чтобы заголовки были кликабельными, после чего событие начинается (что-то вроде OnClickHeader = "header_ClickEvent"?). Конечно, есть элемент SortExpression, который позволяет сортировать сетку, но я хочубыть в состоянии начать любое событие, например, при нажатии кнопки.

Я не смог найти никакого решения в рамках asp: BoundField или asp: TemplateField ... Я думал, что гиперссылка может решить проблему, но это былонемного преждевременноКроме того, при использовании TemplateField мне очень трудно заполнить столбец данными.Кто-нибудь может принести мне решение?

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

1 голос
/ 23 апреля 2010

Забавно, у меня была такая же проблема сегодня, и, как и вы, я нашел решение, приведенное выше, немного.

Вот кое-что, чем я доволен.

Во-первых, вынеобходимо использовать CSS Friendly Control адаптеры .Есть много других преимуществ, если вы используете 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>

Теперь, чтобы перейти кхорошая частьЭтот бит jQuery в событии document.ready будет иметь желаемый эффект.

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

См.документация по форматированию и т. д.

1 голос
/ 23 апреля 2010

Это старый код, заметьте.Это можно оптимизировать.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...