ContainerGridDataBinding в Infragistics WebHierarchicalDataGrid

Я пытаюсь выполнить пейджинг с настраиваемой привязкой данных в элементе управления Infragistics WebHierarchicalDataGrid. Желаемое поведение, когда пользователь щелкает ссылку страницы в пейджере WHDG, состоит в том, чтобы получить одну страницу данных из бэкэнда (у меня уже есть SQL Server SP, который делает это) и привязать ее к WHDG для отображения 1 страницы за раз.

Я считаю, что использование события "ContainerGridDataBinding" - это способ сделать это, но я не могу настроить рабочий код. Любая помощь или примеры кода о том, как это сделать, приветствуются.

Также было бы здорово, если бы такое же поведение сохранялось на дочерних диапазонах WHDG.


person Yuriy Galanter    schedule 16.08.2012    source источник


Ответы (2)


После того, как у вас есть SQL-запросы/команды выбора, вы получите одну страницу, для которой вы захотите создать собственный пейджер. Затем в событиях, связанных с кнопками/выпадающим списком или другим элементом управления, который у вас есть на пейджере, вы должны вызывать свои команды SQL. Ниже описано, как реализовать пользовательский пейджер для WebDataGrid:

http://help.infragistics.com/NetAdvantage/ASPNET/2012.1/CLR4.0/?page=WebDataGrid_Using_Custom_Paging_Template.html

Пользовательский пейджер с помощью кода: http://help.infragistics.com/NetAdvantage/ASPNET/2012.1/CLR4.0/?page=WebDataGrid_Using_Custom_Paging_Template_in_Code.html

Выполнение этого для WebHierarchicalDataGrid будет таким же для родительского бэнда. Для детей вы захотите сделать это для поведения этой группы, а не родительской группы.

Теперь, если вы не хотите использовать кнопки и/или раскрывающиеся списки в своем пейджере и вместо этого хотите использовать ссылки (1,2,3,4 и т. д.), это можно сделать, выполнив в коде следующее:

    private class CustomItemTemplate : ITemplate
    {
        #region ITemplate Members

        public void InstantiateIn(Control container)
        {
            for (int i = 0; i < 3; i++)
            {
                LiteralControl link = new LiteralControl();
                //class for current page: igg_PageCurrent
                //class for other pages: igg_PageLink
                link.Text = "<span class='igg_PageLink' idx='" + i.ToString() + "'>" + (i+1).ToString() + "</span>";

                container.Controls.Add(link);
            }
        }

        #endregion
    }

    protected void Page_PreInit(object sender, EventArgs e)
    {
        whdg1.Behaviors.Paging.PagerTemplate = new CustomItemTemplate();
    }

Однако реальная проблема заключается в том, что при получении данных таким образом из базы данных вы получаете достаточно данных только для одной страницы, поэтому сетка не знает, сколько страниц находится в базе данных. Поэтому вам нужно либо знать, как найти это, либо просто знать это. Это также усложнит реализацию дочерней полосы, поскольку вам нужно будет знать для каждой строки, которая может быть расширена, сколько дочерних записей или страниц записей.

person MPeterson    schedule 18.09.2012
comment
На самом деле все оказалось намного проще, чем я думал. При каждом событии PageIndexChanged (даже вызванном пользовательским пейджером, который может быть пользовательским UserControl) я привязываю WHDG к поддельному пустому набору данных, вызывая срабатывание ContainerGridDataBinding, в котором данные только для текущей страницы извлекаются из БД. - person Yuriy Galanter; 18.09.2012

Это оказалось намного проще, чем я думал. При каждом событии PageIndexChanged (даже вызванном пользовательским пейджером, который может быть пользовательским UserControl) я привязываю WHDG к поддельному пустому набору данных, вызывая срабатывание ContainerGridDataBinding, в котором данные только для текущей страницы извлекаются из БД.

person Yuriy Galanter    schedule 18.09.2012