|
https://technet.microsoft.com/en-us/library/ms143221(v=sql.105).aspx |
Элементы-потребители данных. 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();
}