Опубликован: 14.11.2006 | Доступ: свободный | Студентов: 5898 / 532 | Оценка: 4.18 / 3.74 | Длительность: 16:37:00
ISBN: 978-5-9556-0085-7
Лекция 8:

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

Добавим на форму следующий источник данных:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ 
ConnectionStrings:DemoBaseConnectionString %>"
    SelectCommand="dbo.SelectUsers" 
SelectCommandType="StoredProcedure" 
    DeleteCommand="dbo.DeleteUser"  
DeleteCommandType="StoredProcedure" 
    UpdateCommand="dbo.EditUser" 
UpdateCommandType="StoredProcedure" 
    InsertCommand="dbo.EditUser" 
InsertCommandType="StoredProcedure"
    OldValuesParameterFormatString="">
    <InsertParameters>
        <asp:Parameter Direction="ReturnValue" Name="RETURN_VALUE" 
            Type="Int32" />
        <asp:Parameter Name="UID" Type="Int32" DefaultValue="0" />
        <asp:ControlParameter Name="Name" Type="String" 
ControlID="NameTextBox"/>
        <asp:ControlParameter Name="Comments" Type="String" 
ControlID="CommentTextBox" PropertyName="Text"/>
        <asp:ControlParameter Name="Registered"  Type="Boolean" 
ControlID="Registered" PropertyName="Checked"/>
    </InsertParameters>
    <UpdateParameters>
        <asp:Parameter Direction="ReturnValue" 
Name="RETURN_VALUE"
          Type="Int32" />
        <asp:ControlParameter Name="UID" Type="Int32" 
ControlID="HiddenField1" />
        <asp:ControlParameter Name="Name" Type="String" 
ControlID="NameTextBox"/>
        <asp:ControlParameter Name="Comments" Type="String" 
ControlID="CommentTextBox"/>
        <asp:ControlParameter Name="Registered"  Type="Boolean" 
ControlID="Registered" PropertyName="Checked"/>
    </UpdateParameters>
    <DeleteParameters> 
        <asp:ControlParameter ControlID="HiddenField1" 
PropertyName="Value" Name="UID" Type="Int32" /> 
    </DeleteParameters> 
</asp:SqlDataSource>

Обратите внимание на то, что в InsertParameters значение параметра UID по умолчанию 0 и он не связан с элементом управления. В остальных случаях он связан с HiddenField1. Значение в это поле будет передаваться в обработчиках.

На этот раз DataGrid будет содержать шаблонизированные столбцы TemplateColumn. Этот тип столбца DataGrid позволяет полностью управлять форматом отображения и редактирования данных — можно выводить данные в несколько строк или использовать для редактирования данных любые элементы управления. Например, для отображения булевской информации используем элементы CheckBox:

<asp:DataGrid id="UsersDataGrid"  runat="server" 
    AutoGenerateColumns="False" DataKeyField="UID" 
    OnDeleteCommand="UsersDataGrid_DeleteCommand" 
    OnUpdateCommand="UsersDataGrid_UpdateCommand" 
    OnEditCommand="UsersDataGrid_EditCommand" 
DataSourceID="SqlDataSource1"
    AllowSorting="True" Caption="Users" CaptionAlign="Top"> 
    <Columns>
    <asp:TemplateColumn HeaderText= "Имя"> 
      <ItemTemplate> 
        <asp:Label id="Label1" runat="server" 
        Text='<%#DataBinder.Eval(Container, "DataItem.Name")%>'>
        </asp:Label>
      </ItemTemplate> 
      <EditItemTemplate> 
        <asp:TextBox id=NameTextBox runat="server" 
        Text='<%# DataBinder.Eval(Container, "DataItem.Name") %>'>
        </asp:TextBox>
      </EditItemTemplate>
    </asp:TemplateColumn> 
    <asp:TemplateColumn HeaderText="Комментарии">
      <ItemTemplate> 
        <asp:Label id="Label2" runat="server" Text='<%# 
DataBinder.Eval(Container, "DataItem.Comments")%>'></asp:Label>
      </ItemTemplate>
      <EditItemTemplate>
        <asp:TextBox id= CommentTextBox runat="server" Text='<%# 
DataBinder.Eval(Container, "DataItem.Comments")%>'>
        </asp:TextBox>
      </EditItemTemplate>
    </asp:TemplateColumn>
    <asp:TemplateColumn HeaderText= "Зарегистрирован">
      <ItemTemplate>
        <asp:CheckBox  runat="server" ID="Registered" 
Checked='<%# (bool) DataBinder.Eval(Container, 
"DataItem.isRegistered") %>'
              Enabled="False"></asp:CheckBox >
      </ItemTemplate>
      <EditItemTemplate>
        <asp:CheckBox runat="server" ID="Registered" Checked='<%# 
(bool) DataBinder.Eval(Container, "DataItem.isRegistered") 
%>'></asp:CheckBox>
      </EditItemTemplate>
      </asp:TemplateColumn>
    <asp:TemplateColumn>
      <ItemTemplate>
        <asp:LinkButton id="LinkButton1" runat="server" 
CommandName="edit">редактировать</asp:LinkButton> ::
        <asp:LinkButton id="LinkButton2" runat="server" 
CommandName="delete">удалить</asp:LinkButton>
      </ItemTemplate>
      <EditItemTemplate>
        <asp:LinkButton id="LinkButton3" runat="server" 
CommandName="update">принять</asp:LinkButton> ::
        <asp:LinkButton id="LinkButton4" runat="server" 
CommandName="cancel">отменить</asp:LinkButton>
      </EditItemTemplate>
    </asp:TemplateColumn>
  </Columns>
</asp:DataGrid>

И остальные элементы:

<asp:TextBox ID="NameTextBox" runat="server" ></asp:TextBox>
<asp:TextBox ID="CommentTextBox" 
runat="server"></asp:TextBox>
<asp:CheckBox ID="Registered" runat="server" /><br /><br />
<asp:Button ID="Button1" runat="server" Text="Add" 
OnClick="Add_Click" />
<asp:HiddenField ID="HiddenField1" runat="server" />

DataGrid уже будет выводить данные, имеет гиперссылки для правки и удаления, но при нажатии ничего не происходит. Остается написать нужный код. SqlDataSource уже знает параметры команды Delete, это единственный параметр, и связан он был с HiddenField1. Нужно записать значение ключа id в это поле:

protected void UsersDataGrid_DeleteCommand(object source, 
System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
    HiddenField1.Value = 
UsersDataGrid.DataKeys[e.Item.ItemIndex].ToString();
    // Удаление
    SqlDataSource1.Delete();
    // Обновление данных после удаления
    UsersDataGrid.DataBind();
}

Добавление записи происходит еще проще, так как параметры процедуры Insert находятся в тех текстовых полях, которые заполняются для вставки:

protected void Add_Click(object sender, EventArgs e)
{
    SqlDataSource1.Insert();
    UsersDataGrid.DataBind();
}
Алексей Савельев
Алексей Савельев

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