Опубликован: 14.11.2006 | Уровень: для всех | Доступ: платный
Лекция 8:

Элементы-потребители данных. Data-Bound Controls

Добавим в эту форму возможность сортировки по столбцам. DataGrid поддерживает свойство AllowSorting. Но это только потенциальная возможность сортировки, так как сам элемент сортировать не может, это должен обеспечить программист. При AllowSorting = True в заголовке выводятся гиперссылки, при нажатии на которые вызывается событие SortCommand. Так как нет автогенерации, в описание BoundColumn нужно вставить SortExpression:

<asp:BoundColumn DataField="name" FooterText="Name" 
HeaderText="Фамилия" SortExpression="name">
    </asp:BoundColumn>

Метод-обработчик события SortCommand принимает параметр типа DataGridSortCommandEventArgs, в свойстве SortExpression которого содержится строка — выражение сортировки SortExpression. Необходимо использовать это выражение для сортировки данных, полученных из источника данных

protected void DataGrid2_SortCommand(object source, DataGridSortCommandEventArgs e)
{
    ViewState["sort"] = e.SortExpression;
    bindData();
}

где bindData() вынесен в отдельную функцию и вызывается также из Page_Load:

private void bindData()
{
    String xmlFilename = Server.MapPath("") + "\\nobel.xml";
    DataSet newDataSet = new DataSet();
    newDataSet.ReadXml(xmlFilename);
    if (ViewState["sort"] != null)
        newDataSet.Tables[3].DefaultView.Sort = 
(string)ViewState["sort"];
    DataTable newDataTable = newDataSet.Tables[3];
    DataGrid2.DataSource = newDataTable;
    DataGrid2.DataBind();
}

void Page_Load()
{
    if (!IsPostBack)
        bindData();
}
Фамилия Страна Год Произведение
Romain Rollan France 1915 "Jean-Cristophe"
George Bernard Shaw Great Britain 1925
Boris Pasternak Russia 1958 "Doctor Zhivago"
Gabriel Garsia Marquez Columbia 1982 "100 years of solitude"
Name Country Year won Work

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

Покажем возможность удаления, обновления и редактирования данных в DataGrid с помощью SqlDataSource.

Создайте на сервере SQL в базе DemoBase таблицу Users с тремя полями:

Column Name Data Type Allow Nulls
UID int
Name varchar(50)
Comments varchar(250) +
IsRegistered bit +

Поле UID — автоинкрементное. Поэтому операция INSERT не будет требовать задания его значения. Конечно, это первичный ключ. В таблице свойств найдите IdentitySpecification, раскройте его и выберите ( IsIdentity ).

Будем работать с таблицей с помощью трех процедур.

CREATE PROCEDURE dbo.SelectUsers
(
	@Col INT = 0
)
AS
IF @Col = 0
		SELECT * FROM Users
	ELSE IF @Col = 1
		SELECT * FROM Users ORDER BY NAME
	RETURN

Процедура EditUser будет использоваться для вставки записей, если @UID=0, и для обновления в противном случае:

CREATE PROCEDURE dbo.EditUser
	(
	@UID int = 0,
	@Name varchar(50),
	@Comments varchar(250),
	@Registered bit
)
AS
	IF @UID = 0
		INSERT INTO Users(Name, Comments, IsRegistered) 
VALUES(@Name, @Comments, @Registered)
	ELSE
		UPDATE Users SET Name = @Name, Comments = @Comments, 
IsRegistered = @Registered WHERE UID = @UID
	RETURN

Процедура для удаления записей.

CREATE PROCEDURE dbo.DeleteUser
(
	@UID int
) 
		AS
		DELETE FROM Users WHERE UID = @UID
	RETURN

На форме будет находиться, кроме DataGrid, два элемента редактирования — NameTextBox, а также CommentTextBox и кнопка Add. Для наших тайных целей добавим элемент управления типа HiddenField. Эти цели — хранить id текущего элемента и передавать его SqlDataSource.

Алексей Савельев
Алексей Савельев

https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx

Денис Прокофьев
Денис Прокофьев

Везде написано, что это самый независимый и простой в использовании навигационный элемент управления, что он работает сразу с web.sitemap и не требует определения SiteMapDataSource.

Моя карта сайта состоит из двух страниц, вложенных друг в друга. asp:Menu, asp:TreeView отбображаются как ожидалось, а вот asp:SiteMapPath - нет. Он не виден нигде. Однако на его месте формируется разметка: <span id="SiteMapPath1"><a href="#SiteMapPath1_SkipLink" style="position:absolute;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden;">Проход по ссылкам навигации</a><a id="SiteMapPath1_SkipLink"></a></span> - т.е. элемент отрабатывает.

В словах xHTML это выглядит так: <asp:SiteMapPath ID="SiteMapPath1" runat="server" />. Причем не важно - внутри тега form или снаружи - всегда одинаково.

Т.к. другие нав. ЭУ работают через простой источник данных без ошибок, делаю вывод - карта составлена правильно. ИД: <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />

Карта: <?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
  <siteMapNode url="~/L11_1_simplePage.aspx" title="Страница 1"  description="Простая страница 1." >
    <siteMapNode url="~/L11_1SimplePage2.aspx" title="Страница 2"  description="Простая страница 2" />
  </siteMapNode>
</siteMap>

Почему так происходит? Вроде делаю все по примерам. VS Community 2015. NetFramework в проекте: v4.0.30319

Зарина Каримова
Зарина Каримова
Казахстан, Алматы, Гимназия им. Ахмета Байтурсынова №139, 2008
Akiyev Begench
Akiyev Begench
Беларусь, Полоцк, полоцкий государственный университет