Repeater OnItemCommand

In this post I will show a simple implementation on OnItemCommand of the repeater control.

This is suitable when you render items in a repeater and want to edit individual items

Consider this sample class

public class Products

{
public string ProductCode {get;set;}
public string ProductName {get;set;}
public decimal ProductPrice {get;set;}

}

You can display objects from this class very easily using any database call or Linq

In your repeater, you have a button to ‘Edit’ next to each product, which will allow admin users to change prices

So, the repeater might looks like this

 <asp:Repeater ID="RepeaterListOfProducts" runat="server" OnItemDataBound="RepeaterListOfProducts_OnItemDataBound" OnItemCommand="RepeaterListOfProducts_OnItemCommand">

<HeaderTemplate><ul></HeaderTemplate>

<ItemTemplate>

<li>
<label>

       <asp:Literal ID="LiteralProdcutCode" runat="server"></asp:Literal>
        <asp:Literal ID="LiteralProdcutName" runat="server"></asp:Literal>
        <asp:Literal ID="LiteralProductPrice" runat="server" ></asp:Literal>
</label>
        <asp:Button ID="ButtonEditProduct" runat="server" Text="Edit" CommandName="Edit" />

</li>

</ItemTemplate>

<FooterTemplate></ul></FooterTemplate>

</asp:Repeater>

In code behind, you have a function to populate products something like

RepeaterListOfProducts.DataSource = db.GetAllProducts();
RepeaterListOfProducts.DataBind();

In OnItemDataBound, I will assign ProductCode (assuming that is primary key/unique value per product) to the CommandArgument
for the button, so each button will have different argument when it is clicked

Sample code may look like this

protected void RepeaterListOfProducts_OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{

Product product = (Product)e.Item.DataItem;

Literal productCode = (Literal)e.Item.FindControl("LiteralProdcutCode");
productCode.Text = product.ProdcutCode;

Literal productName = (Literal)e.Item.FindControl("LiteralProdcutName");
productName.Text = product.ProdcutName;

Literal productPrice = (Literal)e.Item.FindControl("LiteralProductPrice");
productPrice.Text = product.ProductPrice;

Button update = (Button)e.Item.FindControl("ButtonEditProduct");
update.CommandArgument = product.ProductCode;

}

}

Now comes the interesting part, in you OnItemCommand, I will take the command button argument and setup a predefined text box (in a differnt panel) with the value
and let the user update the price in a panel

protected void RepeaterListOfUsers_OnItemCommand(object sender, RepeaterCommandEventArgs e)
{
if (e.CommandName == "Edit")
{
LiteralUpdateProductCode.Text = e.CommandArgument.ToString();
TextBoxUpdatePrice.Text = ((Literal)e.Item.FindControl("LiteralProductPrice")).Text;
//add your custom logic here

}
}

The above codes takes the price and code from the repeater items and allows user to update with your custom logic.

In the panel, I could also have another button, which will perform my custom logic.

This code can be extended to include ‘Delete’ operation as well.

Thanks

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.