Asp компонент tools


Содержание

Editor / All tools

Description

You can see in this demo the whole set of tools supported by the Telerik MVC Editor. You can easily add or hide each of them through the Tools collection option of the component:

.Tools(tools => tools. Clear().Bold().Italic().Underline().Strikethrough(). FontName().FontSize().FontColor().BackColor().Print())

If you remove the Clear() option, the default toolbar will be shown along with the specified by you buttons.

Какой JavaScript или компонент ASP.NET Charting Component/Tool/Library будут работать для этого?

[Обновить]: Забыл включить ComponentArt.

Разработчик взаимодействия, используемый клиентом, в котором я сейчас работаю, создал некоторые макеты, и теперь моя работа — определить лучший способ реализации включенных в него графиков.

Посмотрев на параметры, о которых я знаю, и смог найти несколько простых поисков Google, я сузил его до использования ComponentArt , Dundas Charts или Инфраструктура , просто потому, что из того, что я могу видеть в своих демонстрационных записях, у них есть определенные функции, которые, я считаю, мне нужно будет сделать.

Вот фотографии из макетов — в идеале мне нужно одно программное обеспечение, которое будет охватывать все из них:

Эта диаграмма кажется достаточно простой.

Обратите внимание на произвольный интервал между годами — еще не уверен, что это будет точка привязки для клиента или нет.

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

Вот тот же график, только на этот раз, иллюстрирующий, что происходит, когда пользователь переводит мышью или нажимает на аннотацию в диаграмме. Они хотят приятного стиля в всплывающем окне, поэтому всплывающее окно должно быть чем-то вроде iframe или аналогичного. Очевидно, что до тех пор, пока элемент управления поддерживает события на стороне клиента, с соответствующими метаданными, я могу создать всплывающее окно.

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

Разработка на ASP.NET. MasterPage, динамические компоненты, AJAX, ASP.NET MVC

7.4.2. Компонент DataList

Серверный веб-элемент управления DataList отображает данные базы данных в настраиваемом формате [11]. Формат для отображения данных определяется в создаваемых шаблонах. Можно создавать шаблоны для элементов, чередующихся элементов, выбранных элементов и редактируемых элементов. Для настройки общего вида DataList имеются также шаблоны заголовка, нижнего колонтитула и разделителя. Добавление серверного веб-элемента управления Button в шаблоны позволяет подключить элементы-списки к коду, что дает возможность пользователям переключаться между режимами отображения, выделения и редактирования.

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

При необходимости в элементе управления DataList можно настроить возможность редактирования или удаления данных пользователем. Можно также настроить этот элемент управления для поддержки других функциональных возможностей, например для выделения строк.

Вид элементов данных задается шаблонами с использованием элементов управления и текста HTML. Например, серверный веб-элемент управления Label можно использовать для отображения поля из источника данных.

Данные к этому серверному компоненту привязываются тем же образом, что и для GridView .

7.4.2.1. Определение шаблонов для элементов DataList

В элементе управления DataList можно задавать структуру данных при помощи шаблонов. В табл. 7.1 описаны шаблоны, которые поддерживаются элементом управления DataList .

Таблица 7.1. Шаблоны, поддерживаемые DataList
Свойство шаблона Описание
ItemTemplate Содержит элементы управления и элементы HTML, которые заполняются только один раз для каждой строки в источнике данных.
AlternatingItemTemplate Содержит элементы управления и элементы HTML, которые заполняются по одному разу для каждой новой строки в источнике данных. Как правило, этот шаблон используется в целях создания другого вида для чередующихся строк, например, для задания цвета фона, отличающегося от указанного в свойстве ItemTemplate .
SelectedItemTemplate Содержит элементы, которые должны отображаться при выборе пользователем элемента в элементе управления DataList . Как правило, этот шаблон используется для того, чтобы визуально выделить выбранную строку с помощью другого фона или цвета шрифта. Элемент может быть также развернут путем отображения дополнительных полей из источника данных.
EditItemTemplate Задает макет элемента в режиме редактирования. Обычно этот шаблон содержит элементы управления для редактирования, например TextBox .
HeaderTemplate и FooterTemplate . Содержит текст и элементы управления, отображающиеся в начале и конце списка соответственно.
SeparatorTemplate Содержит элементы, которые отображаются между элементами данных. Типичным примером может служить строка (задается с помощью элемента HR ).
7.4.2.2. События

Элемент управления DataList поддерживает определенные события. Одно из них, событие ItemCreated , дает возможность настраивать процесс создания элементов во время выполнения. Событие ItemDataBound также предоставляет возможность настройки элемента управления DataList , но только после того, как данные становятся доступными для проверки. Например, при использовании элемента управления DataList для отображения списка необходимых дел можно показывать просроченные элементы красным цветом, выполненные – черным, а остальные – зеленым. Любое из вышеописанных событий может быть использовано для переопределения форматирования, определенного в шаблоне.

Остальные события вызываются в ответ на нажатия кнопок в элементах-списках. Они разработаны, чтобы упростить реагирование на наиболее часто используемые функциональные возможности элемента управления DataList . Поддерживаются четыре события этого типа:

  • EditCommand ;
  • DeleteCommand ;
  • UpdateCommand ;
  • CancelCommand .

Чтобы вызвать эти события, следует добавить элементы управления Button , LinkButton или ImageButton в шаблоны элемента управления DataList и установить для свойства CommandName кнопки ключевое слово, например edit , delete или updatecancel . Когда пользователь нажимает кнопку в элементе, событие передается в контейнер кнопки – элемент управления DataList . Конкретное событие, вызываемое нажатием на кнопку, зависит от значения свойства CommandName этой кнопки. Например, если для свойства CommandName кнопки задано значение edit , то при нажатии этой кнопки вызывается событие EditCommand . Если свойство CommandName имеет значение delete , то при нажатии кнопки вызывается событие DeleteCommand , и т. д.

Элемент управления DataList также поддерживает событие ItemCommand , возникающее при нажатии кнопки, не имеющей заранее заданной команды, такой как edit или delete . Это событие можно использовать для настройки функциональности путем установки для свойства CommandName кнопки требуемого значения и последующей проверки его в обработчике событий ItemCommand .

7.4.2.3. Пример использования DataList

Рассмотрим пример использования компонента DataList для вывода списка комментариев:

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

7.5. Разработка пользовательских компонент

Для разработки и повторного использования собственных компонент используются файлы с расширением ascx [12].

Добавим в проект новый пользовательский компонент, выбрав в окне Add New Item » Web User Control » (рис. 7.14).

Как и в случае со страницей будет создано два файла, один из которых содержит разметку компонента, а второй – серверный код.

Код с разметкой начинается с заголовка, указывающего, что в этом файле описывается серверный компонент на языке C #, code-behind которого содержится в файле products/ProductControl.ascx.cs , а сам компонент будет иметь название products_ProductControl :

Остальная часть файла представляет собой обычную ASP -страницу. Все серверные пользовательские компоненты наследуют от класса System.Web.UI.UserControl , хотя также есть возможность отнаследовать свой компонент и от некоторых других классов.

Рассмотрим пример простого компонента:

Этот компонент состоит из HTML таблицы, в ячейки которой помещены два компонента Label и один Image . На рис. 7.15 показано, как разработанный компонент выглядит в дизайнере Visual Studio 2008.

Теперь разработанный компонент можно многократно использовать на различных страницах в проекте (он также появится во вкладке Toolbox , и его можно будет перетаскивать на новые страницы мышкой).

Для этого необходимо добавить в начало файла следующую строчку, которая зарегистрирует компонент на странице и позволит его использовать под именем AWCDShop:ProductControl ( AWCDShop – название проекта, используемого для того, чтобы выделить пользовательские компоненты , которые разработаны в текущем проекте. Можно использовать любое название):

Теперь на самой странице этот компонент можно использовать следующим образом:

Award-winning .NET and JavaScript Controls for Mobile, Web and Desktop

Save time and focus more on your business logic with this complete, fast and flexible toolkit of UI controls for .NET, JavaScript and Xamarin. Includes:

  • Platforms
  • WinForms
  • WPF
  • UWP
  • Xamarin
  • JavaScript*
  • ASP.NET MVC
  • ASP.NET Core MVC
  • Web APIs
  • .NET Standard


  • Controls
  • Data Grids
  • Charts
  • Reports
  • Input
  • Schedulers
  • Calendars
  • Ribbons
  • And more!
400+ fast, extensible controls

Using the same control in two platforms? No problem. Our API is unified across platforms for easy migration and built to be extended.

Powerful server-side Web APIs

Empower and extend your web apps with a server-side API that includes services for imaging, Excel, barcode, data engine, PDF, and reporting.

Specialized controls for enterprises

Take your enterprise apps even further with specialized Financial Charting, BI/PivotTables, Excel UI, and the ability to customize FlexReport Designer.

.NET Standard service components

.NET Standard service components for text parsing from non-structured objects and powerful ETL data management tools.

*JavaScript controls included with Wijmo

Studio Enterprise and Ultimate subscribers get access to Wijmo’s 60+ JavaScript UI controls with full framework support.

Full Visual Studio 2020 and Windows 10 Support

Seamless Visual Studio 2020 integration means you won’t compromise functionality for older apps, and you’ll still get full support for modern operating systems.

Top Controls

Industry’s Best .NET Data Grid Control

The industry’s best data grid is fast, flexible, and time-tested. Built-in features include:

  • Flexible data binding
  • Sorting, grouping, and filtering
  • Cell selection and editing

FlexChart, 80+ .NET Chart Types

With 80+ .NET chart types and DirectX rendering, FlexChart’s data visualizations will add life to your apps. Built-in features include:

  • Flexible data binding
  • Series selection and labels
  • Multiple axes and plot areas

Powerful Spreadsheets

Implement Excel’s top features in a smaller, faster web-based package The small core on HTML5, JavaScript, and ASP.NET offers limitless possibilities for extensibility

Easily write readable, markup-style code with TagHelper and Intellisense support

FlexReport, .NET Reporting

FlexReport’s lightning-fast .NET reporting engine completes every enterprise UI toolbox. Easy migration, beautiful data visualization, and the standalone FlexReport Designer allow even the most novice developers to generate top-notch reports.

High-Speed Excel-like Pivot Tables and Charts

Built on a super-charged data engine that gives users more power and speed that processes millions of records in milliseconds. Includes pivot tables, charts and a pivot panel UI that allows users to create dynamic views.

InputPanel for .NET Apps

Full data entry form with a single line of code

New Service Components

Text Parser

The new ComponentOne TextParser for .NET Standard enables you to efficiently integrate data from semi-structured sources, such as emails and invoices, into your workflows.

Data Engine

The new ComponentOne DataEngine for .NET Core uses in-memory caching technology to deliver faster extraction, transformation and loading (ETL) of large and complex data sets.

Supported Platforms & Editions

For development platforms new and old, we have you covered

Desktop
Legacy
Service and Components
  • Web API
  • .NET Standard Components
Mobile

What’s New

The new ComponentOne TextParser

Data Engine — The new ComponentOne DataEngine (C1DataEngine) for .NET Core uses in-memory caching technology to deliver faster extraction, transformation, and loading of large and complex data sets.

Text Parser — The new ComponentOne TextParser (C1TextParser) for .NET Standard enables you to efficiently extract data from plain text or Html files that can then be stored in a table of records or transferred to another system.

Илон Маск рекомендует:  Что такое код xml_set_unparsed_entity_decl_handler

Support for .NET framework 4.5.2 — Starting with 2020 v2, .NET 4.5.2 will be the lowest supported framework for the controls. This means that all new features and new controls will be exclusive to .NET 4.5.2, however, we will continue to maintain the 4.0 version of the controls for one year until 2020 v2.

Office 365 Ribbon for WinForms — The new Ribbon for WinForms is built on .NET 4.5.2 and it’s based on UI concepts of Office 365. With it you’ll enjoy:

  • New simplified view when the ribbon is collapsed.
  • 20+ embedded controls including buttons, progress bars, updated galleries and more.
  • Enhanced set of embedded images for buttons along with support for font and vector-based icons.
  • A backstage view and status bar component.

RichTextBox Simplified Ribbon for WPF — For our favorite RichTextBox control in WPF, we’ve improved the ribbon-style toolbar to support a simplified look-and-feel based off the latest Microsoft Office UI. The ribbon toolbar can be expanded and collapsed just like the ribbon in Microsoft Office.

FlexViewer Xamarin Support — The cross-platform FlexViewer control is now partially supported for the Xamarin Platform. Use the FlexViewer (beta) to display PDF files in your Xamarin.Forms, Xamarin.Android or Xamarin.iOS mobile apps. The viewer supports page navigation and text search.


FlexGrid Enhancements

FlexGrid Column Footers Enabled Fixed Column Summaries for WinForms — The footer row can be fixed or scrollable as the last row in the grid. Within the footer you can easily show aggregates like sum, average, min, max, etc. Footers can also show values based on expressions, such as calculations based on several columns (i.e., a grand total).

FlexGrid Custom Expressions — It is now finally possible to use custom expressions as subtotals in groups along with aggregates.

FlexGrid Enhancements for ASP.NET — We’ve added a FlexGrid.ErrorTip property that allows you to specify a tooltip to use when showing validation errors.

FlexPivot/OLAP Enhancements

FlexPivot for WinForms Supports Group Ranges — Grouped ranges allow for custom grouping of data into binned ranges, such as Ages 10-20, Ages 21-39, Ages 40-59+, or you can now create yearly quarter groups with just a simple date field. You can create grouped ranges based upon string, numeric and date fields.

OLAP Enhancements for ASP.NET — We’ve added two enhancements for OLAP including an outline mode and value field column headers. The PivotGrid.OutlineMode property causes the grid to show groups in outline format, allowing users to collapse rows to create a compact display. The PivotGrid.showValueFieldHeaders property causes the grid to show headers for value fields even in views that have a single value field.

FlexChart Enhancements

FlexPie Multiple Pie Series — You can now use FlexPie to visualize more of your data in a single chart by creating multiple pie chart «series» using the same data source.

FlexChart Custom Data Filter Sample — We added a new sample that demonstrates using a FlexChart inside a DataFilter control as a custom filter. You can choose to filter the data by clicking on data points, adjust the time period by using the range bar, and filter the range selection by dragging the mouse. You can see this sample in action by downloading the WinForms Edition Samples.

FlexChart Enhancements for ASP.NET

Range Area Charts — Range area charts plot two values on the Y axis for each data point and fill the area between. This is like the range bar and column charts that plot a range of two values for each data point.

Series Tooltips & ItemFormatter — The new series itemFormatter function enables you to customize appearance of data points for specific series in charts that contain multiple series. And the new series tooltip property enables you to customize the tooltip for specific series in charts that contain multiple series

Award-winning .NET and JavaScript Controls for Mobile, Web and Desktop

Save time and focus more on your business logic with this complete, fast and flexible toolkit of UI controls for .NET, JavaScript and Xamarin. Includes:

  • Platforms
  • WinForms
  • WPF
  • UWP
  • Xamarin
  • JavaScript*
  • ASP.NET MVC
  • ASP.NET Core MVC
  • Web APIs
  • .NET Standard
  • Controls
  • Data Grids
  • Charts
  • Reports
  • Input
  • Schedulers
  • Calendars
  • Ribbons
  • And more!
400+ fast, extensible controls

Using the same control in two platforms? No problem. Our API is unified across platforms for easy migration and built to be extended.

Powerful server-side Web APIs

Empower and extend your web apps with a server-side API that includes services for imaging, Excel, barcode, data engine, PDF, and reporting.

Specialized controls for enterprises

Take your enterprise apps even further with specialized Financial Charting, BI/PivotTables, Excel UI, and the ability to customize FlexReport Designer.

.NET Standard service components

.NET Standard service components for text parsing from non-structured objects and powerful ETL data management tools.

*JavaScript controls included with Wijmo

Studio Enterprise and Ultimate subscribers get access to Wijmo’s 60+ JavaScript UI controls with full framework support.

Full Visual Studio 2020 and Windows 10 Support

Seamless Visual Studio 2020 integration means you won’t compromise functionality for older apps, and you’ll still get full support for modern operating systems.

Top Controls

Industry’s Best .NET Data Grid Control

The industry’s best data grid is fast, flexible, and time-tested. Built-in features include:

  • Flexible data binding
  • Sorting, grouping, and filtering
  • Cell selection and editing

FlexChart, 80+ .NET Chart Types

With 80+ .NET chart types and DirectX rendering, FlexChart’s data visualizations will add life to your apps. Built-in features include:

  • Flexible data binding
  • Series selection and labels
  • Multiple axes and plot areas

Powerful Spreadsheets

Implement Excel’s top features in a smaller, faster web-based package The small core on HTML5, JavaScript, and ASP.NET offers limitless possibilities for extensibility

Easily write readable, markup-style code with TagHelper and Intellisense support

FlexReport, .NET Reporting

FlexReport’s lightning-fast .NET reporting engine completes every enterprise UI toolbox. Easy migration, beautiful data visualization, and the standalone FlexReport Designer allow even the most novice developers to generate top-notch reports.

High-Speed Excel-like Pivot Tables and Charts


Built on a super-charged data engine that gives users more power and speed that processes millions of records in milliseconds. Includes pivot tables, charts and a pivot panel UI that allows users to create dynamic views.

InputPanel for .NET Apps

Full data entry form with a single line of code

New Service Components

Text Parser

The new ComponentOne TextParser for .NET Standard enables you to efficiently integrate data from semi-structured sources, such as emails and invoices, into your workflows.

Data Engine

The new ComponentOne DataEngine for .NET Core uses in-memory caching technology to deliver faster extraction, transformation and loading (ETL) of large and complex data sets.

Supported Platforms & Editions

For development platforms new and old, we have you covered

Desktop
Legacy
Service and Components
  • Web API
  • .NET Standard Components
Mobile

What’s New

The new ComponentOne TextParser

Data Engine — The new ComponentOne DataEngine (C1DataEngine) for .NET Core uses in-memory caching technology to deliver faster extraction, transformation, and loading of large and complex data sets.

Text Parser — The new ComponentOne TextParser (C1TextParser) for .NET Standard enables you to efficiently extract data from plain text or Html files that can then be stored in a table of records or transferred to another system.

Support for .NET framework 4.5.2 — Starting with 2020 v2, .NET 4.5.2 will be the lowest supported framework for the controls. This means that all new features and new controls will be exclusive to .NET 4.5.2, however, we will continue to maintain the 4.0 version of the controls for one year until 2020 v2.

Office 365 Ribbon for WinForms — The new Ribbon for WinForms is built on .NET 4.5.2 and it’s based on UI concepts of Office 365. With it you’ll enjoy:

  • New simplified view when the ribbon is collapsed.
  • 20+ embedded controls including buttons, progress bars, updated galleries and more.
  • Enhanced set of embedded images for buttons along with support for font and vector-based icons.
  • A backstage view and status bar component.

RichTextBox Simplified Ribbon for WPF — For our favorite RichTextBox control in WPF, we’ve improved the ribbon-style toolbar to support a simplified look-and-feel based off the latest Microsoft Office UI. The ribbon toolbar can be expanded and collapsed just like the ribbon in Microsoft Office.

FlexViewer Xamarin Support — The cross-platform FlexViewer control is now partially supported for the Xamarin Platform. Use the FlexViewer (beta) to display PDF files in your Xamarin.Forms, Xamarin.Android or Xamarin.iOS mobile apps. The viewer supports page navigation and text search.

FlexGrid Enhancements

FlexGrid Column Footers Enabled Fixed Column Summaries for WinForms — The footer row can be fixed or scrollable as the last row in the grid. Within the footer you can easily show aggregates like sum, average, min, max, etc. Footers can also show values based on expressions, such as calculations based on several columns (i.e., a grand total).

FlexGrid Custom Expressions — It is now finally possible to use custom expressions as subtotals in groups along with aggregates.

FlexGrid Enhancements for ASP.NET — We’ve added a FlexGrid.ErrorTip property that allows you to specify a tooltip to use when showing validation errors.

FlexPivot/OLAP Enhancements

FlexPivot for WinForms Supports Group Ranges — Grouped ranges allow for custom grouping of data into binned ranges, such as Ages 10-20, Ages 21-39, Ages 40-59+, or you can now create yearly quarter groups with just a simple date field. You can create grouped ranges based upon string, numeric and date fields.

OLAP Enhancements for ASP.NET — We’ve added two enhancements for OLAP including an outline mode and value field column headers. The PivotGrid.OutlineMode property causes the grid to show groups in outline format, allowing users to collapse rows to create a compact display. The PivotGrid.showValueFieldHeaders property causes the grid to show headers for value fields even in views that have a single value field.

FlexChart Enhancements

FlexPie Multiple Pie Series — You can now use FlexPie to visualize more of your data in a single chart by creating multiple pie chart «series» using the same data source.

FlexChart Custom Data Filter Sample — We added a new sample that demonstrates using a FlexChart inside a DataFilter control as a custom filter. You can choose to filter the data by clicking on data points, adjust the time period by using the range bar, and filter the range selection by dragging the mouse. You can see this sample in action by downloading the WinForms Edition Samples.

FlexChart Enhancements for ASP.NET

Range Area Charts — Range area charts plot two values on the Y axis for each data point and fill the area between. This is like the range bar and column charts that plot a range of two values for each data point.

Series Tooltips & ItemFormatter — The new series itemFormatter function enables you to customize appearance of data points for specific series in charts that contain multiple series. And the new series tooltip property enables you to customize the tooltip for specific series in charts that contain multiple series

Разработка на ASP.NET. MasterPage, динамические компоненты, AJAX, ASP.NET MVC

7.4.2. Компонент DataList

Серверный веб-элемент управления DataList отображает данные базы данных в настраиваемом формате [11]. Формат для отображения данных определяется в создаваемых шаблонах. Можно создавать шаблоны для элементов, чередующихся элементов, выбранных элементов и редактируемых элементов. Для настройки общего вида DataList имеются также шаблоны заголовка, нижнего колонтитула и разделителя. Добавление серверного веб-элемента управления Button в шаблоны позволяет подключить элементы-списки к коду, что дает возможность пользователям переключаться между режимами отображения, выделения и редактирования.

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

При необходимости в элементе управления DataList можно настроить возможность редактирования или удаления данных пользователем. Можно также настроить этот элемент управления для поддержки других функциональных возможностей, например для выделения строк.

Илон Маск рекомендует:  Sqlфункции без использования фразы group by

Вид элементов данных задается шаблонами с использованием элементов управления и текста HTML. Например, серверный веб-элемент управления Label можно использовать для отображения поля из источника данных.

Данные к этому серверному компоненту привязываются тем же образом, что и для GridView .

7.4.2.1. Определение шаблонов для элементов DataList

В элементе управления DataList можно задавать структуру данных при помощи шаблонов. В табл. 7.1 описаны шаблоны, которые поддерживаются элементом управления DataList .

Таблица 7.1. Шаблоны, поддерживаемые DataList
Свойство шаблона Описание
ItemTemplate Содержит элементы управления и элементы HTML, которые заполняются только один раз для каждой строки в источнике данных.
AlternatingItemTemplate Содержит элементы управления и элементы HTML, которые заполняются по одному разу для каждой новой строки в источнике данных. Как правило, этот шаблон используется в целях создания другого вида для чередующихся строк, например, для задания цвета фона, отличающегося от указанного в свойстве ItemTemplate .
SelectedItemTemplate Содержит элементы, которые должны отображаться при выборе пользователем элемента в элементе управления DataList . Как правило, этот шаблон используется для того, чтобы визуально выделить выбранную строку с помощью другого фона или цвета шрифта. Элемент может быть также развернут путем отображения дополнительных полей из источника данных.
EditItemTemplate Задает макет элемента в режиме редактирования. Обычно этот шаблон содержит элементы управления для редактирования, например TextBox .
HeaderTemplate и FooterTemplate . Содержит текст и элементы управления, отображающиеся в начале и конце списка соответственно.
SeparatorTemplate Содержит элементы, которые отображаются между элементами данных. Типичным примером может служить строка (задается с помощью элемента HR ).
7.4.2.2. События

Элемент управления DataList поддерживает определенные события. Одно из них, событие ItemCreated , дает возможность настраивать процесс создания элементов во время выполнения. Событие ItemDataBound также предоставляет возможность настройки элемента управления DataList , но только после того, как данные становятся доступными для проверки. Например, при использовании элемента управления DataList для отображения списка необходимых дел можно показывать просроченные элементы красным цветом, выполненные – черным, а остальные – зеленым. Любое из вышеописанных событий может быть использовано для переопределения форматирования, определенного в шаблоне.

Остальные события вызываются в ответ на нажатия кнопок в элементах-списках. Они разработаны, чтобы упростить реагирование на наиболее часто используемые функциональные возможности элемента управления DataList . Поддерживаются четыре события этого типа:

  • EditCommand ;
  • DeleteCommand ;
  • UpdateCommand ;
  • CancelCommand .

Чтобы вызвать эти события, следует добавить элементы управления Button , LinkButton или ImageButton в шаблоны элемента управления DataList и установить для свойства CommandName кнопки ключевое слово, например edit , delete или updatecancel . Когда пользователь нажимает кнопку в элементе, событие передается в контейнер кнопки – элемент управления DataList . Конкретное событие, вызываемое нажатием на кнопку, зависит от значения свойства CommandName этой кнопки. Например, если для свойства CommandName кнопки задано значение edit , то при нажатии этой кнопки вызывается событие EditCommand . Если свойство CommandName имеет значение delete , то при нажатии кнопки вызывается событие DeleteCommand , и т. д.

Элемент управления DataList также поддерживает событие ItemCommand , возникающее при нажатии кнопки, не имеющей заранее заданной команды, такой как edit или delete . Это событие можно использовать для настройки функциональности путем установки для свойства CommandName кнопки требуемого значения и последующей проверки его в обработчике событий ItemCommand .

7.4.2.3. Пример использования DataList

Рассмотрим пример использования компонента DataList для вывода списка комментариев:


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

7.5. Разработка пользовательских компонент

Для разработки и повторного использования собственных компонент используются файлы с расширением ascx [12].

Добавим в проект новый пользовательский компонент, выбрав в окне Add New Item » Web User Control » (рис. 7.14).

Как и в случае со страницей будет создано два файла, один из которых содержит разметку компонента, а второй – серверный код.

Код с разметкой начинается с заголовка, указывающего, что в этом файле описывается серверный компонент на языке C #, code-behind которого содержится в файле products/ProductControl.ascx.cs , а сам компонент будет иметь название products_ProductControl :

Остальная часть файла представляет собой обычную ASP -страницу. Все серверные пользовательские компоненты наследуют от класса System.Web.UI.UserControl , хотя также есть возможность отнаследовать свой компонент и от некоторых других классов.

Рассмотрим пример простого компонента:

Этот компонент состоит из HTML таблицы, в ячейки которой помещены два компонента Label и один Image . На рис. 7.15 показано, как разработанный компонент выглядит в дизайнере Visual Studio 2008.

Теперь разработанный компонент можно многократно использовать на различных страницах в проекте (он также появится во вкладке Toolbox , и его можно будет перетаскивать на новые страницы мышкой).

Для этого необходимо добавить в начало файла следующую строчку, которая зарегистрирует компонент на странице и позволит его использовать под именем AWCDShop:ProductControl ( AWCDShop – название проекта, используемого для того, чтобы выделить пользовательские компоненты , которые разработаны в текущем проекте. Можно использовать любое название):

Теперь на самой странице этот компонент можно использовать следующим образом:

Какой JavaScript или компонент ASP.NET Charting Component/Tool/Library будут работать для этого?

[Update]: Forgot to include ComponentArt.

Разработчик взаимодействия, используемый клиентом, в котором я сейчас работаю, создал некоторые макеты, и теперь моя работа — определить лучший способ реализации включенных в него графиков.

Изучив варианты, о которых я знаю, и смог найти некоторые простые поисковые запросы Google, я сузил их до использования ComponentArt , Dundas Charts или Infragistics , просто потому, что из того, что я вижу из их демо, у них есть определенные функции, которые, я считаю, мне нужно будет сделать.

Вот фотографии из макетов — в идеале мне нужно одно программное обеспечение, которое будет охватывать все из них:

This chart seems to be simple enough.

Notice the arbitrary spacing between the years — not yet sure if this will be a sticking-point for the client or not.

I don’t know that I have ever seen a chart like this one — it combines the previous chart with some additional data.

Here is the same chart, only this time illustrating what happens when a user mouses-over or clicks on an annotation within the chart. They want the nice styling within the pop-up, so the pop-up needs to be something like an iframe or similar. Obviously, as long as a control supports client-side events, with associated metadata, I can create the pop-up myself.

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

Поиск по сайту

Предлагаю вашему вниманию обзор платных и бесплатных компонентов для разработки ASP.NET и Windows Forms приложений.

Платные компоненты

Компоненты от DevExpress являются самыми популярными компонентами для разработки ASP.NET и Windows Forms приложений.

  • Grid and Data Editors
  • Ribbon, Toolbar-Menu
  • OLAP Data Mining Control
  • Calendar / Scheduler
  • Reporting Tool
  • TreeView-Grid Hybrid
  • Gauges and Dashboards
  • Rich Text Editor
  • Wizard Control
  • Property Grid
  • Charting Control
  • Layout Manager
  • Navigation Pane
  • Data Editors and Controls
  • Printing-Exporting Library
  • Spell Checker
  • Reporting Tool
  • Charting Control
  • Grid and Data Editors
  • Filter Editor
  • Calendar / Scheduler
  • HTML Editor
  • Gauges and Dashboards
  • TreeView-Grid Hybrid
  • Data Editors
  • OLAP Data Mining Control
  • Spell Checker
  • Cloud
  • List View
  • Menu
  • Navigation Pane
  • News List
  • Popup Window
  • Site Map
  • Tab Control
  • Title Index
  • Upload Control
  • Utility Components

ComponentOne поставляет наборы компонентов на все случаи жизни для различных технологий, включая ASP.NET и Windows Forms.

Полный же список следующий:

  • Studio Enterprise
  • Studio for WinForms
  • Studio for WPF
  • Studio for ASP.NET
  • Studio for Silverlight
  • Studio for iPhone
  • Studio for Mobile
  • Studio for ActiveX
  • Reports for .NET Designer Edition
  • IntelliSpell
  • XapOptimizer
  • LiveLinq

Компоненты от компании Dundas предназначены для визуализации данных:

  • Dundas Chart
  • Dundas Gauge
  • Dundas Map
  • Dundas Calendar

Telerik — набор компонентов для различных .NET технологий.

Telerik Premium Collection for .NET:

  • RadControls for ASP.NET AJAX
  • RadControls for WinForms
  • RadControls for WPF
  • RadControls for Silverlight
  • Telerik Reporting
  • Telerik OpenAccess ORM

Obout

Obout — отличный набор ASP.NET компонентов (obout Suite for ASP.NET 2.0/3.0/3.5) с отличной документацией и примерами. Бесплатный для студентов.

  • TreeView
  • Grid
  • Editor
  • Spell checker
  • Calendar
  • Easy menu
  • Combobox
  • Slide menu
  • AJAXPage
  • Scheduler
  • Context menu (with Easy menu)
  • TabStrip (with Easy menu)
  • Slide Panel (with Slide menu)
  • Two colors menu
  • Splitter
  • Super button
  • Tree_DB
  • Show
  • Flyout
  • Window
  • FileUploadProgress
  • ColorPicker
  • Toolbar (with Supper button)
  • Autosuggest (with Combobox)
  • Multilevel Combobox (with Combobox)
  • State Selector (with Combobox)

Другие компоненты

  • Infragistics: http://www.infragistics.com/
  • PureComponents: http://www.purecomponents.com/
  • DivElements: http://www.divelements.com/
  • Syncfusion: http://www.syncfusion.com/
  • ComponentFactory: http://www.componentfactory.com/

Бесплатные компоненты

Chart Controls for .NET Framework

После установки Chart Controls for .NET Framework и Chart Controls Add-on for Visual Studio 2008 (именно в таком порядке) в Toolbox появится новый контрол Chart.

Контрол имеет очень большую функциональность и действительно багатый настраиваемый интерфейс. Есть демо приложения для ASP.NET и Windows Forms. Детальнее можно почитать здесь.

Microsoft Chart control is based on Dundas Chart source code version 5.5. В Visual Studio 2010 этот контрол входит в поставку.

SharpPieces — это набор бесплатных ASP.NET контролов:

  • ExtendedDropDownList
  • LiveGrid
  • FancyUpload
  • ImageCheckBox
  • Rating
  • DynamicImage
  • CaptchaImage
  • GradientButton

Ajax Control Toolkit

Ajax Control Toolkit — набор open source компонентов для ASP.NET AJAX приложений.


  • Accordion
  • AlwaysVisibleControl
  • Animation
  • AutoComplete
  • Calendar
  • CascadingDropDown
  • CollapsiblePanel
  • ColorPicker
  • ComboBox
  • ConfirmButton
  • DragPanel
  • DropDown
  • DropShadow
  • DynamicPopulate
  • FilteredTextBox
  • HoverMenu
  • HTMLEditor
  • ListSearch
  • MaskedEdit
  • ModalPopup
  • MultiHandleSlider
  • MutuallyExclusiveCheckBox
  • NoBot
  • NumericUpDown
  • PagingBulletedList
  • PasswordStrength
  • PopupControl
  • Rating
  • ReorderList
  • ResizableControl
  • RoundedCorners
  • Slider
  • SlideShow
  • Tabs
  • TextBoxWatermark
  • ToggleButton
  • UpdatePanelAnimation
  • ValidatorCallout

Другие контролы

Если вы не нашли необходимых вам компонентов, советую обратиться на codeplex, где можно с большой вероятностью найти необходимый контрол, например Google Maps Control.

Missing Microsoft.Data.Tools.Schema.Sql.UnitTesting. Again

The bug is very old but MS didn’t fix it so far.

I had a VS2015 solution (many projects, with main ASP.NET one) and I opened it in VS 2020.

Here is what I saw when I tried to build it:

So, I figured, okay, some referenced broke, I went into Project References, removed those two (. Sql.UnitTesting and . Tools.Components), and tried to add them back. What did I saw? Of course, this:

The version is wrong, its 15.1.0.0 instead of previous 15.0.0.0 (for both DLLs). Big deal, you say, but it still doesn’t compile:

It tells me that the versions are mismatched and I have to create some assembly-bindings in the web.config file. Which I did, first manually, then via the double-click on the warning, as it suggested. Nothing changed. I still can’t get my project build.

Previous SO questions (Automatic reference to Microsoft.Data.Tools.Schema.Sql.UnitTesting, Where is the Microsoft.VisualStudio.TestTools.UnitTesting namespace on VS2010?) don’t help much, I cannot remove SSDT component, as it breaks the loading of the web-project completely. And my project isn’t any sort of SQL Testing project. It is just a regular ASP.NET 4 web app.

What can I do to fix this?

3 Answers 3

I have searched the project’s file and found this:

Then I searched the PC for Microsoft.Data.Tools.Schema.Sql.UnitTesting.targets and I found some interesting results (clickable):

So, my previous studio, VS2015, had the v14 version of the file and the referenced were of 14 version as well, which is fine.

But the new VS2020’s had references to the 15.0.0.0 , according to the file contents:

But the actual folder, which should contain these files has 15.1.0.0 version! And the binding redirects in my web.config file just doesn’t work for some reason.

I see two solutions from here, change the Microsoft.Data.Tools.Schema.Sql.UnitTesting.targets file so that it would contain 15.1.0.0 version, or replace 15.1.0.0 with 15.0.0.0 ones. I’ll go with former now. Update soon.

Update

It still didn’t help. No there are no build errors but the project build failed.

I also tried to remove those two XML lines from project’s file and it kinda worked. Not so sure, because it now behaves even more weird.

It gave me a strange «missing ‘,'» error on a line with somemethod(out Ticket ticket); (new C#7 feature), which is fine and doesn’t have any errors, the error itself disappeared after 1 seconds after I saw it, but when I switched it back to C#6 way, it all finally built without problems. I’ll try to run the project now.

Update

Yeah, just as I thought, dear Microsoft. Now it gives me this:

So, there are some changes are yet to be made for me to finish my manual upgrade a simple webapp from vs2015 to vs2020.

Разработка элементов управления ASP.NET на примере навигационной панели (исходники)

Эта проблема стара, как само веб-программирование — даже на самом простом сайте нам нужна панель навигации (или меню). Ну да, та самая, где написано: «О компании», «Услуги», «Прайс-лист», «Сервис» и «Контакты».

Давным-давно я писал её на Perl и SSI, потом на PHP, потом на ASP, и конца этому не было, пока не вышла 2-ая версия ASP.NET.

Илон Маск рекомендует:  Связанные подзапросы

Разработчики Microsoft предложили удобное расширяемое решение, которое позволило описывать иерархию страниц в несложном XML-файле, а при желании — увязывать между собой структуры из разных источников (например, из базы данных, из дерева каталогов на диске, из нескольких XML-файлов).

Кроме того, мы получили компоненты для отображения структуры сайта: TreeView , Menu и SiteMapPath . Казалось бы — вот оно, счастье!

Однако нет. Я обнаружил, что простым сайтам нужна лёгкая линейная структура, и встроенные компоненты оказываются для этого случая слишком «громоздкими». Вроде всё хорошо, но не совсем понятно, стоит ли для пары-тройки ссылок подгружать столько кода на JavaScript.

С другой стороны, дизайнеры тоже не дремлют — иногда с ними можно договориться о цвете ссылок, но если речь идёт о навигации, они непреклонны. Хорошо, если ребята не настаивают на ручной отрисовке каждого пункта меню, но вот подложку и roll-over им надо сделать обязательно. И объяснить, что TreeView или Menu для этого не предназначены, чертовски сложно.

Единственное, что нам остаётся — написать подходящий компонент самостоятельно. Этим мы и займёмся.

Для примера возьмём самую простую структуру сайта:

xml version =»1.0″ encoding =»utf-8″ ? >
siteMap xmlns =»http://schemas.microsoft.com/AspNet/SiteMap-File-1.0″ >
siteMapNode url =»

/Default.aspx» title =»Главная страница» >
siteMapNode url =»

/Services.aspx» title =»Услуги и цены» />
siteMapNode url =»

/Contacts.aspx» title =»Контакты» />
siteMapNode >
siteMap >

Нам бы хотелось получить тривиальную панель навигации, например, вот такого вида:

/ Главная страница / Услуги и цены / Контакты /

Текущая страница должна выводиться простым текстом, а все остальные — ссылками.

В коде страницы мы хотим задействовать шаблоны (такие же, как и в компоненте Repeater):

binateq:NavigationPanel ID =»NavigationPanel1″
runat =»server» DataSourceID =»SiteMapDataSource1″ >
HeaderTemplate > / HeaderTemplate >
ItemTemplate >
a href =` ` > #Container.Title %> a > /
ItemTemplate >
SelectedItemTemplate >
span > #Container.Title %> span > /
SelectedItemTemplate >
binateq:NavigationPanel >
asp:SiteMapDataSource ID =»SiteMapDataSource1″ runat =»server» />

Если свести все требования воедино, нужно, чтобы компонент:

  • Умел подключаться к SiteMapDataSource и разворачивал структуру сайта в линейный список.
  • Использовал шаблоны, разные для текущей страницы и для всех остальных.

Нам «всего лишь» осталось реализовать два перечисленных выше пункта, и затем сделать так, чтобы у нас получился компонент, который можно подвесить на панель инструментов (Toolbox).

Подключение к SiteMapDataSource

Для того, чтобы наш компонент мог подключиться кSiteMapDataSource, мы должны унаследовать его от класса System.Web.UI.WebControls.HierarchicalDataBoundControl и переопределить виртуальный метод PerformDataBinding

public class NavigationPanel: HierarchicalDataBoundControl
<
protected override void PerformDataBinding()
<
base .PerformDataBinding();
nodes.Clear();

if (!IsBoundUsingDataSource >null ))
return ;

HierarchicalDataSourceView view = GetData( string .Empty);

if (view != null )
<
IHierarchicalEnumerable enumerable = view.Select();

RecurseDataBind(enumerable, 1);
>
>
>
Для начала мы должны убедиться, что программист установил одно из свойств DataSource или DataSourceID . Если панель навигации не подключена к SiteMapDataSource (то есть ни одно из свойств не установлено), посетитель сайта увидит содержимое шаблона EmptyTemplate .

Обратите внимание, что DataSource мы проверяем сами, а вот для ревизии DataSourceID необходимо обратиться к свойству IsBoundUsingDataSourceID .

Непосредственный доступ к данным возможен через представление (класс HierarchicalDataSourceView ), то есть тем же способом, каким мы работаем с любым источником данных в .NET, будь то SqlDataSource или XmlDataSource .

Метод GetData позволяет получить любое поддерево структуры сайта, но поскольку нам нужна вся иерархия, в качестве пути мы указываем пустую строку.

Всю работу по извлечению данных выполняет наш метод RecurseDataBind , который рекурсивно вызывает сам себя:

private void RecurseDataBind(IHierarchicalEnumerable enumerable, int level)
<
foreach ( object item in enumerable)
<
IHierarchyData hierarchyData = enumerable.GetHierarchyData(item);
SiteMapNode siteMapNode = hierarchyData as SiteMapNode;

if (siteMapNode != null )
<
if ( HttpContext .Current == null //
siteMapNode.IsAccessibleToUser( HttpContext .Current))
<
bool isSelected =
(siteMapNode.Prov >null ) ?
false :
(siteMapNode.Prov >
nodes.Add(
new Node(
ToAbsolute(siteMapNode.Url),
siteMapNode.Title,
siteMapNode.Description,
level,
isSelected
)
);
>

if (hierarchyData.HasChildren)
<
IHierarchicalEnumerable recurseEnumerable =
hierarchyData.GetChildren();

if (recurseEnumerable != null )
RecurseDataBind(recurseEnumerable, level + 1);
>
>
>
>

Метод проверяет, что он работает с объектами класса SiteMapNode (программист может передать нашему компоненту любую иерархию, и эту ситуацию надо обрабатывать).

С помощью вызова IsAccessibleToUser мы прячем от неавторизованного посетителя недоступные страницы. Авторизация работает только во время исполнения, когда установлено свойство HttpContext.Current , поэтому при настройке компонента в Visual Studio (design mode) все страницы видимы.

Низкоуровневый доступ к данным осуществляет провайдер (наследник класса SiteMapProvider ) из которого мы получаем информацию о текущей странице. Провайдеры доступны только во время выполнения, поэтому в режиме редактирования ни одна страница текущей не является.

Как видим, метод RecurseDataBind сохраняет информацию об уровне вложенности (переменная level ), которой мы можем воспользоваться при подготовке шаблонов.

Функция ToAbsolute переводит виртуальные пути (

/Default.aspx ) в абсолютные ( /Default.aspx ). Фактически, она вызывает VirtualPathUtility.ToAbsolute , но кроме того, обрабатывает ситуации, когда в качестве пути заданы полные URI ( http://domain.tld/path/filename.ext ).

Результатом работы метода RecurseDataBind становится список объектов класса Node, который мы обсудим позднее.

Для того, чтобы наш класс понимал шаблоны, мы должны описать свойства класса ITemplate и установить для них несколько атрибутов:

private ITemplate headerTemplate = null ;
private ITemplate footerTemplate = null ;
private ITemplate itemTemplate = null ;
private ITemplate selectedItemTemplate = null ;
private ITemplate emptyTemplate = null ;

[Browsable( false )]
[PersistenceMode(PersistenceMode.InnerProperty)]
[DefaultValue( typeof (ITemplate), «» )]
[TemplateContainer( typeof (Node))]
public virtual ITemplate HeaderTemplate
<
get < return headerTemplate; >
set < headerTemplate = value ; >
>

В целях экономии места, я опустил описание свойств FooterTemplate , ItemTemplate , SelectedItemTemplate и EmptyTemplate , которые полностью идентичны описанию HeaderTemplate .

С помощью атрибутов мы указываем визуальному редактору (т.е. Visual Studio), как обрабатывать эти свойства:

  • Browsable(false)
    Свойства-шаблоны недоступны на панели Properties во время редактирования. Такое же поведение характерно для «родных» компонентов ASP.NET.
  • PersistentMode(PersistentMode.InnerProperty)
    Шаблоны в коде странице представлены не в виде атрибутов, а в виде вложенных тегов. Пользуясь этой подсказкой, в Visual Studio работает IntelliSense.
  • DefaultValue(typeof(ITemplate), «»)
    Значением по умолчанию является пустой шаблон (без текста и вложенных тегов). Этот атрибут позволяет перевести значение свойства в исходное состояние.
  • TemplateContainer(typeof(Node))
    Одно из самых важных свойств, которое обеспечивает привязку к данным (data binding). О подробностях мы поговорим ниже.

Генерация кода страницы выполняется в методе CreateChildControls :

protected override void CreateChildControls()
<
Controls.Clear();

if (nodes.Count > 0)
<
InstantiateTemplate(headerTemplate);

foreach (Node node in nodes)
<
if (node.IsSelected)
InstantiateNodeTemplate(selectedItemTemplate, node);
else
InstantiateNodeTemplate(itemTemplate, node);
>

InstantiateTemplate(footerTemplate);
>
else
InstantiateTemplate(emptyTemplate);
>

Два вспомогательных метода InstantiateTemplate и InstantiateNodeTemplate я написал, чтобы упростить CreateChildControls :

private void InstantiateTemplate(ITemplate template)
<
if (template != null )
<
Control templateHolder = new Control();
template.InstantiateIn(templateHolder);
Controls.Add(templateHolder);
>
>

private void InstantiateNodeTemplate(ITemplate template, Node node)
<
if (template != null )
<
template.InstantiateIn(node);
Controls.Add(node);
node.DataBind();
>
>

Если свойство установлено, нужно добавить в код страницы элементы управления, описанные в шаблоне.

Эту работу выполняет метод InstantiateIn , которому требуется родительский объект Control , где и будут созданы дочерние элементы управления. Если программист определил шаблон в коде страницы, ASP.NET создаёт для нас объект, реализующий интерфейс ITemplate , в том числе и этот метод.

В методе InstantiateNodeTemplate мы пользуемся уже готовым объектом класса Node , который также является наследником Control . Для того чтобы в код шаблона попали значения выражений вида , мы вызываем метод DataBind .

Давайте подробнее остановимся на том, как происходит связывание с данными (data binding):

  • Данные нужно сначала получить, а затем вставить в Control . Метод InstantiateIn устроен так, что получение данных и отображение выполняется через один и тот же объект, поэтому наш класс Node с одной стороны содержит свойства Url , Title , Description , а с другой — наследует классу Control и используется для отображения шаблона. Такой подход снижает зацепление , т.е. класс выполняет действия, которые никак друг с другом не связаны, и делать так не рекомендуется. Что ж, это тот самый случай, когда мы ничего не можем исправить.
  • Если мы используем внутри шаблона элементы управления, у которых установлен атрибут ID , он будет дублироваться у повторяющихся шаблонов, что приведёт к ошибке. Речь идёт о таких конструкциях, как:

ItemTemplate >
asp:LinkButton ID =» LB » runat =» server » Text =» Container . Title %>» OnClick =» LB_Click » />
ItemTemplate >

Последнее, что мы должны сделать, это увязать между собой разворачивание структуры сайта в линейный список и его отображение:

public override void DataBind()
<
base .DataBind();
CreateChildControls();
ChildControlsCreated = true ;
>

Метод base.DataBind среди прочего вызывает PerformDataBinding , и сразу после этого мы создаём дочерние компоненты на базе шаблонов.

Доводим компонент до ума

Поддержка ViewState и сериализация

Для того чтобы на странице автоматически работали такие компоненты, как GridView и Repeater , ASP.NET вызывает метод DataBind при первой загрузке страницы. Метод вызывается рекурсивно для всех компонентов страницы, они получают данные и сохраняют их в ViewState. При повторных запросах POST данные не считываются до тех пор, пока мы сами этого не сделаем.

Мы должны обеспечить такое же поведение для класса Node , иначе навигационная панель будет «пропадать» со страницы при запросах POST.

Технически, это делается в два этапа:

  • Мы переопределяем методы SaveViewState и LoadViewState у класса NavigationPanel .
  • Мы делаем класс Node сериализуемым.

Код методов SaveViewState и LoadViewState достаточно прост, поэтому я не буду останавливаться на нём подробно:

protected override object SaveViewState()
<
object [] currentStates = new object [nodes.Count + 1];
currentStates[0] = base .SaveViewState();

for ( int i = 0; i return ( object )currentStates;
>

protected override void LoadViewState( object savedState)
<
if (savedState != null )
<
object [] currentStates = ( object [])savedState;

Оба метода предполагают, что объекты класса Node умеют себя сохранять (сериализовывать) и восстанавливать (десериализовывать). В простейших случаях, когда речь идёт о сохранении/восстановлении публичных свойств, достаточно пометить класс атрибутом Serializable , и .NET сам сможет выполнить необходимую работу.

Однако в нашем случае этот способ не подходит, поскольку сериализуемым должен быть не только класс Node , но и все его предки. Проблему в данном случае создаёт класс Control , которому мы должны наследовать.

Чтобы её решить, мы должны реализовать в классе Node интерфейс ISerializable , то есть один-единственный метод GetObjectData :

[SecurityPermission(SecurityAction.LinkDemand, Flags =
SecurityPermissionFlag.SerializationFormatter)]
public void GetObjectData(SerializationInfo info, StreamingContext context)
<
info.AddValue( «Url» , url);
info.AddValue( «Title» , title);
info.AddValue( «Description» , description);
info.AddValue( «Level» , level);
info.AddValue( «IsSelected» , isSelected);
>

Кроме того, мы должны добавить в класс защищённый конструктор, который создаёт объект из сохранённых ранее значений:

protected Node(SerializationInfo info, StreamingContext context)
<
url = info.GetString( «Url» );
title = info.GetString( «Title» );
description = info.GetString( «Description» );
level = info.GetInt32( «Level» );
isSelected = info.GetBoolean( «IsSelected» );
>

Узлы дерева мы храним в закрытом поле nodes :

Родительский блок DIV

Компонент NavigationPanel является наследником WebControl , который требует, чтобы содержимое компонента размещалось внутри одного из HTML-тегов. По умолчанию в качестве родительского тега используется SPAN , но нам больше подошёл бы тег DIV . Чтобы этого добиться, достаточно переопределить защищённое свойство TagKey :

При описании компонента NavigationPanel мы должны установить несколько атрибутов, чтобы Visual Studio могла правильно работать с ним в коде страницы:

[assembly:TagPrefix( «Binateq.Web.Controls» , «binateq» )]
namespace Binateq.Web.Controls
<
[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level =
AspNetHostingPermissionLevel.Minimal)]
[ParseChildren( true )]
[ToolboxData(
» »
)]
public class NavigationPanel: HierarchicalDataBoundControl
<

>
>

На слово binateq не обращайте внимания — я употребляю его при написании своего кода, вы же вполне можете задействовать ваше собственное название.

В свойстве assembly:TagPrefix задаётся префикс для компонентов, который будет использован Visual Studio. Обычно она сама генерирует их (uc1, uc2 и т.д.), но такие названия бессмысленны, поэтому я предпочитаю указать префикс при написании компонента.

Атрибут ParseChildren указывает Visual Studio на то, что теги внутри трактуются как значения свойств, то есть содержимое тега HeaderTemplate будет присвоено свойству NavigationPanel.HeaderTemplate .

Атрибут ToolBoxData подсказывает Visual Studio, что именно нужно вставить в код страницы при добавлении компонента. Вместо <0>будет вставлен префикс, в нашем случае binateq.

Помимо основного файла NavigationPanel.cs вы найдёте там вспомогательный — Utilities.cs , в котором собраны методы для корректного преобразования виртуальных, абсолютных и относительных путей (тот самый метод ToAbsolute , про который я не стал писать в статье).

Можно подключить компонент к панели инструментов Visual Studio. Для этого распахните Toolbox , щёлкните правой кнопкой мыши внутри закладки General и выберите пункт Choose Items . В открывшемся диалоге нажмите кнопку Browse и загрузите Binateq.Controls.dll .

После этого навигационную панель можно будет перетаскивать с панели инструментов в код страницы. Visual Studio автоматически вставит в начало страницы строку , и добавит в проект ссылку (reference) на Binateq.Controls.dll .

При выводе структуры сайта мы можем исключить корневую страницу, установив SiteMapDataSource.ShowStartingNode в false . Мы также можем выводить многоуровневую структуру, воспользовавшись свойством Container.Level :

ItemTemplate >
div class =»level » >
a href =` ` > #Container.Title %> a >
div >
ItemTemplate >
SelectedItemTemplate >
div class =»level » >
#Container.Title %>
div >
SelectedItemTemplate >

Определив в таблице стилей классы div.level1 , div.level2 , div.level3 , мы можем с помощью отступов отразить древовидную структуру сайта. Существующий компонент не умеет ограничивать количество уровней вложенности, и за этим придётся следить самостоятельно. Вы можете внести в код компонента необходимые изменения, добавив свойство, например, MaxLevel , и заменив в коде RecourseDataBind

if (hierarchyData.HasChildren && (maxLevel == 0 // maxLevel > level))

Если MaxLevel будет равен 0, то компонент будет показывать все уровни, а если, например, 5, то только первые 5.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL