Saudações pessoal,
Continuando com a série de artigos sobre DataList, venho neste artigo mostrar as funcionalidades deste controle quanto a edição de dados.
Então vamos ao trabalho....
Edição de Dados em um Controle DataList
O controle de DataList suporta a edição in-place dos dados em um registro através de sua propriedade EditItemTemplate. O EditItemTemplate define o conteúdo e a aparência do item quando está sendo editado. Por exemplo, o seguinte Template inclui uma caixa de texto, um botão de “Update” e um botão de “Cancelar”.
<EditItemTemplate>
Item: <asp:TextBox
id="Text1"
runat="server"
Text=<%# DataBinder.Eval(Container.DataItem, "Campo")%>
/><br>
<asp:LinkButton
id="button1"
runat="server"
Text="Salvar"
CommandName="update"
/>
<asp:LinkButton
id="button2"
runat="server"
Text="Cancelar"
CommandName="cancel"
/>
</EditItemTemplate>
O EditItemTemplate interage com uma outra propriedade: EditItemIndex. Por default, o valor de EditItemIndex é -1, significando que nenhum dos registros na lista está sendo editado. Quando EditItemIndex é ajustado a um registro em particular, esse registro é alterado usando o EditItemTemplate.
O DataList fornece também eventos que podem ser usados na edição.
EditCommand é chamado quando o usuário clica no botão (comando “update”) Editar dentro de ItemTemplate do DataList. Você pode adicionar código a este evento. A propriedade EditItemIndex é ajustada ao registro selecionado, e então executa um rebinds nos dados do DataList como mostrado no exemplo que segue.
protected void DataList_EditCommand(object Source, DataListCommandEventArgs e)
{
DataList1.EditItemIndex = (int)e.Item.ItemIndex;
BindList();
}
O EditItemTemplate contem tipicamente botões de comando de “update” e “cancel”. Estes botões chamam os eventos de UpdateCommand e CancelCommand, respectivamente. Você pode também programar estes eventos em seu código. A lógica para “cancelar” a edição de um registro é ajustar EditItemIndex a -1, e então fazer um rebinds dos dados ao DataList como mostrado no exemplo abaixo.
protected void DataList_CancelCommand(object Source, DataListCommandEventArgs e)
{
DataList1.EditItemIndex = -1;
BindList();
}
A lógica típica para fazer um “update” e atualizar a origem dos dados é ajustar EditItemIndex em -1, e então efetuar um rebinds (recarga) dos dados ao DataList. O exemplo abaxio mostra a edição de registros em um DataList.
<%@ Import Namespace="System.Data" %>
<html>
<head>
<script language="C#" runat="server">
public DataTable Cart;
public DataView CartView;
void Page_Load(Object Sender, EventArgs E) {
if (Session["DL3_ShoppingCart"] == null) {
Cart = new DataTable();
Cart.Columns.Add(new DataColumn("Qty", typeof(string)));
Cart.Columns.Add(new DataColumn("Item", typeof(string)));
Cart.Columns.Add(new DataColumn("Price", typeof(string)));
Session["DL3_ShoppingCart"] = Cart;
// carregar a primeira vez -- popula com alguns dados
for (int i=1; i<5; i++) {
DataRow dr = Cart.NewRow();
dr[0] = ((int)((i%2)+1)).ToString();
dr[1] = "Item " + i.ToString();
dr[2] = ((double)(1.23 * (i+1))).ToString();
Cart.Rows.Add(dr);
}
}
else
Cart = (DataTable)Session["DL3_ShoppingCart"];
CartView = new DataView(Cart);
CartView.Sort = "Item";
if (!IsPostBack)
BindList();
}
void BindList() {
DataList1.DataSource= CartView;
DataList1.DataBind();
}
void DataList_EditCommand(Object Sender, DataListCommandEventArgs e) {
DataList1.EditItemIndex = (int)e.Item.ItemIndex;
BindList();
}
protected void DataList_CancelCommand(Object Sender, DataListCommandEventArgs e) {
DataList1.EditItemIndex = -1;
BindList();
}
protected void DataList_UpdateCommand(Object Sender, DataListCommandEventArgs e) {
string item = ((System.Web.UI.WebControls.Label)e.Item.FindControl("Label1")).Text;
string qty = ((System.Web.UI.WebControls.TextBox)e.Item.FindControl("Text1")).Text;
string price = ((System.Web.UI.WebControls.TextBox)e.Item.FindControl("Text2")).Text;
// com um banco de dados aqui usaria o comando Update. Como estamos usando
// um DataTable em memória, vamos deletar a linha velha e substituí-la por uma nova entrada
//remove a linha
CartView.RowFilter = "Item="+item+"";
if (CartView.Count > 0) //Se o item existe no carrinho
CartView.Delete(0); //Deleta
CartView.RowFilter = "";
//Adiciona a nova entrada
DataRow dr = Cart.NewRow();
dr[0] = qty;
dr[1] = item;
dr[2] = price;
Cart.Rows.Add(dr);
DataList1.EditItemIndex = -1;
BindList();
}
</script>
</head>
<body>
<h3><font face="Verdana">Editando dados em um DataList</font></h3>
<p></p>
<form id="Form1" runat=server>
<font face="Verdana" size="-1">
<asp:DataList id="DataList1" runat="server"
BorderColor="black"
BorderWidth="1"
GridLines="Both"
CellPadding="3"
CellSpacing="0"
Font-Names="Verdana"
Font-Size="8pt"
Width="150px"
HeaderStyle-BackColor="#aaaadd"
AlternatingItemStyle-BackColor="Gainsboro"
EditItemStyle-BackColor="lightgreen"
OnEditCommand="DataList_EditCommand"
OnUpdateCommand="DataList_UpdateCommand"
OnCancelCommand="DataList_CancelCommand"
>
<HeaderTemplate>
ITENS...
</HeaderTemplate>
<ItemTemplate>
<asp:LinkButton
id="button1"
runat="server"
Text="Editar"
CommandName="edit" />
<%# DataBinder.Eval(Container.DataItem, "Item") %>
</ItemTemplate>
<EditItemTemplate>
Item:
<asp:Label
id="Label1"
runat="server"
Text=<%# DataBinder.Eval(Container.DataItem, "Item") %> />
<br>
Quantidade:
<asp:TextBox
id="Text1"
runat="server"
Text=<%# DataBinder.Eval(Container.DataItem, "Qty") %> />
<br>
Preço R$:
<asp:TextBox
id="Text2"
runat="server"
Text=<%# DataBinder.Eval(Container.DataItem, "Price") %> />
<br>
<asp:LinkButton
id="button2"
runat="server"
Text="Update"
CommandName="update" />
<asp:LinkButton
id="button3"
runat="server"
Text="Cancelar"
CommandName="cancel" />
</EditItemTemplate>
</asp:DataList>
</font>
</form>
</body>
</html>
E é isso pessoal...
No próximo artigo sobre DataList vou mostrar um exemplo onde faço uma conexão com SQL Server 2005 exibindo organizadamente os dados de uma tabela de produtos. O exemplo será baseado em uma editora de livros listando os dados com imagens etc.
Um abraço e até o próximo artigo...