C# - LinkButtons Created Dynamically In A Repeater Don't Fire ItemCommand Event
Jun 2, 2010I've got a repeater that's used to display the output of a dynamic report that takes criteria from webcontrols on the page. Within the repeater's ItemDataBound method I'm adding controls (Linkbuttons for sorting by column values) dynamically to the header of the repeater based on values selected in a checkbox list and at this point setting the CommandArgument and CommandName properties of the linkbuttons.
The issue is that when the linkbuttons are clicked they don't fire the ItemCommand event although they are clearly being correctly created and added to the header (there is some additional code to set the cssClass, text etc. and this works as expected.) The first column header in the repeater is set in the markup and the itemcommand event fires correctly on this one only. When the other column headers are clicked the repeater rebinds as programmed, but the columns are not dynamically re-generated.
Nightmare.ascx
<asp:repeater runat="server" id="rptReport" OnItemDataBound="rptResults_ItemDataBound" OnItemCommand="rptResults_ItemCommand" EnableViewState="true">
<headertemplate>
<table>
<tr runat="Server" id="TRDynamicHeader">
<th>
<!-- This one works -->
<asp:Linkbutton runat="server" CommandName="sort" commandArgument='<%# Eval("Name")%?' />
</th>
<!-- additional header cells get added dynamically here -->
</tr>
</headertemplate>
<itemTemplate>
<td><%# Eval("Name")</td>
...
</itemTemplate>
</asp:repeater>
Nightmare.ascx.cs
protected void PageLoad(object sender, eventArgs e){
if (! isPostback){
setupGui();//just binds dropdowns etc. to datasources
}
}
protected void btnRunReport_Click(...){
List<ReportLines> lstRep = GetReportLines();
rptReport.DataSource = lstRep;
repReport.DataBind();
}
protected void rptReport_ItemDataBound (...){
if (e.Item.ItemType == ListItemType.Header)
{
foreach (ListItem li in chbxListBusFuncs.Items)
{
if (li.Selected)
{
th = new HtmlTableCell();
lb = new LinkButton();
lb.CssClass = "SortColHeader";
lb.CommandArgument = li.Text.Replace(" ", "");
lb.CommandName = "sort";
lb.Text = li.Text;
th.Controls.Add(lb);
((HtmlTableRow)e.Item.FindControl("TRDynamicHeader")).Cells.Add(th);
}
}
}
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
//Row level customisations, totals calculations etc.
}
}
<!-- this only gets called when the 'hardcoded' linkbutton in the markup is clicked.
protected void rptReport_ItemCommand(object sender, Eventargs e){
lblDebug.Text = string.Format("Well? What's Happening? -> {0}:{1}", e.CommandName, e.CommandArgument.ToString());
}
(The only thing that can call the runreport routine is a single button on the page, not shown in the code snippet above.)</textarea></p>
<input type='hidden' name='ID[3]' value='82079' />
<input type='hidden' name='URL[3]' value='http://forums.asp.net/t/1472917.aspx' />
<input type='hidden' name='CAT[3]' value='Forms Data Controls' />
<input type='hidden' name='BOARD[3]' value='microsoft' />
<input type='hidden' name='P_DATE[3]' value='Sep 21, 2009 02:16 AM' />
<input type='hidden' name='RANDOM[3]' value='uck4OZUSh' />
<input type='hidden' name='REPLIES[3]' value='6' />
<input type='hidden' name='USER[3]' value='aziz' />
<p><input class=subject type='text' size='90' name='SUBJECT[3]' value='Forms Data Controls :: ValidationGroup causes button not to fire ItemCommand event' /><select name='INDEXED[3]'><option value='1' selected>UPDATE</option><option value='2'>DELETE</option></select>Sep 21, 2009 02:16 AM - Replies: 6 CAT: Forms Data Controls<a target=_blank href="http://forums.asp.net/t/1472917.aspx">View</a></p>
<p> <textarea rows=10 cols=100 name='POST[3]' onfocus='setSelRange(this, 0, 0)'/>
I have a page with a couple of RequiredFieldValidators, each in its own ValidationGroup. One of the RequiredFieldValidator controls is inside a Datalist and the submit button triggers the relevant DataList_ItemCommand. It works just dandy until I add the ValidationGroup to the button, at which point clicking on the button no longer fires the DataList_ItemCommand event. Here is the HTML
[Code]....
Note that the ValidationGroup name is there, and it is unique. No other ValidationGroups exist with that name. As it stands, this code does NOT fire the DataList_ItemCommand event, so no update occurs. However if I remove the ValidationGroup declaration from the Button control, the event fires properly.
Richard</textarea></p>
<input type='hidden' name='ID[4]' value='140242' />
<input type='hidden' name='URL[4]' value='http://forums.asp.net/t/1621410.aspx' />
<input type='hidden' name='CAT[4]' value='Forms Data Controls' />
<input type='hidden' name='BOARD[4]' value='microsoft' />
<input type='hidden' name='P_DATE[4]' value='Nov 09, 2010 10:04 AM' />
<input type='hidden' name='RANDOM[4]' value='5a4W7DeJ4' />
<input type='hidden' name='REPLIES[4]' value='4' />
<input type='hidden' name='USER[4]' value='aziz' />
<p><input class=subject type='text' size='90' name='SUBJECT[4]' value='Forms Data Controls :: update button in repeater footer wont fire event' /><select name='INDEXED[4]'><option value='1' selected>UPDATE</option><option value='2'>DELETE</option></select>Nov 09, 2010 10:04 AM - Replies: 4 CAT: Forms Data Controls<a target=_blank href="http://forums.asp.net/t/1621410.aspx">View</a></p>
<p> <textarea rows=10 cols=100 name='POST[4]' onfocus='setSelRange(this, 0, 0)'/>
i have a repeater with a button in the footer template which i want to be able to update any of the items that are added (update quantites/totals/delete the item). however the 'UpdateOrderDetails' event never fires when the button is clicked. here is the code within the repeater...
<ItemTemplate>
<tr>
<td>
<asp:CheckBox ID="chkDelete" runat="server" />
<asp:HiddenField ID="hidProduct_Key" runat="server" />
</td>
<td><asp:Literal ID="ltlProduct_Name" runat="server" /></td>
<td><asp:Literal ID="ltlProductOption_Size" runat="server" /></td>
<td><asp:Literal ID="ltlProductOption_Code" runat="server" /></td>
<td><asp:TextBox ID="txtQuantity" runat="server" /></td>
<td><asp:Literal ID="ltlItemPrice" runat="server" /></td>
<td><asp:Literal ID="ltlLineTotal" runat="server" /></td>
</tr>
</ItemTemplate>
<FooterTemplate>
<asp:Panel ID="pnlFooter" runat="server" Visible="False">
<tr id="trTotalExVAT" runat="server">
<td colspan="6">Total (ex VAT)</td>
<td><asp:Literal ID="ltlTotalExVAT" runat="server" /></td>
</tr>
<tr id="trVAT" runat="server">
<td colspan="6">VAT</td>
<td><asp:Literal ID="ltlVAT" runat="server" /></td>
</tr>
<tr>
<td colspan="5">
<asp:Button ID="btnUpdate" OnClick="UpdateOrderDetails" Text="Update" runat="server" />
</td>
<td>Delivery</td>
<td><asp:Literal ID="ltlDelivery" runat="server" /></td>
</tr>
<tr>
<td colspan="6">Total</td>
<td><asp:Literal ID="ltlTotal" runat="server" /></td>
</tr>
</asp:Panel>
</table>
</FooterTemplate>
the 'updateorderdetails' event in code behind is here
Public Sub UpdateOrderDetails(ByVal s As Object, ByVal e As RepeaterCommandEventArgs)
For Each objRepeaterItem As RepeaterItem In rptOrderDetails.Items
Select Case objRepeaterItem.ItemType
Case ListItemType.AlternatingItem, ListItemType.Item
Dim chkDelete As CheckBox = objRepeaterItem.FindControl("chkDelete")
Dim hidProduct_Key As HiddenField = objRepeaterItem.FindControl("hidProduct_Key")
Dim txtQuantity As TextBox = objRepeaterItem.FindControl("txtQuantity")
' check for deletion or update
If chkDelete.Checked Then
Me.Basket.RemoveProduct(hidProduct_Key.Value)
Else
' check for update
If IsNumeric(txtQuantity.Text) AndAlso CInt(txtQuantity.Text) >= 0 Then
Me.Basket.Products(hidProduct_Key.Value).Quantity = txtQuantity.Text
End If
End If
End Select
Next
' update order details
BindOrderDetails()
End Sub
but this procedure is never called when the button is clicked, so wondered what i need to do to get this working
</textarea></p>
<input type='hidden' name='ID[5]' value='49574' />
<input type='hidden' name='URL[5]' value='http://forums.asp.net/t/1522852.aspx' />
<input type='hidden' name='CAT[5]' value='Web Forms' />
<input type='hidden' name='BOARD[5]' value='microsoft' />
<input type='hidden' name='P_DATE[5]' value='Feb 07, 2010 06:01 AM' />
<input type='hidden' name='RANDOM[5]' value='OoKSV9VFH' />
<input type='hidden' name='REPLIES[5]' value='3' />
<input type='hidden' name='USER[5]' value='aziz' />
<p><input class=subject type='text' size='90' name='SUBJECT[5]' value='Web Forms :: ItemCommand not get fire of datalist in IE' /><select name='INDEXED[5]'><option value='1' selected>UPDATE</option><option value='2'>DELETE</option></select>Feb 07, 2010 06:01 AM - Replies: 3 CAT: Web Forms<a target=_blank href="http://forums.asp.net/t/1522852.aspx">View</a></p>
<p> <textarea rows=10 cols=100 name='POST[5]' onfocus='setSelRange(this, 0, 0)'/>
I have imagebutton inside datalist.....the problem is that onclick event of serverside not get executed for only IE ..but its work fine for mozzila....i m not getting what wrong in this code.
aspx code
<asp:DataList
ID="dlProduct"
runat="server"
CellPadding="5"
CellSpacing="5"
Width="300px"
OnItemCommand="dlProduct_ItemCommand"
>
<ItemTemplate>
<p>
<asp:Label
ID="lblName"
Visible="false"
runat="server"
Text='<%# Bind("ModelName") %>'
CssClass="style1"
>
</asp:Label>
</p>
<p>
<strong><span
class="style1">
MRP : Rs.
<asp:Label
ID="mrp"
runat="server"
Text='<%# Bind("mrp") %>'
CssClass="styles"
>
</asp:Label>
</span>
<br
/>
</strong>
</p>
<p>
<strong>
<span
class="style1">Price : Rs.</span>
<asp:Label
ID="PriceLabel"
runat="server"
Text='<%# Bind("price") %>'
CssClass="style1">
</asp:Label> <br
/> </strong>
</p>
<asp:Label
runat="server"
ID="lblQuantity"
Text=""
Font-Bold="true"
CssClass="style1"></asp:Label>
<asp:Textbox
ID="tbQuantity"
runat="server"
Width="22px"
Text="1"
CssClass="nutext"
Visible="false"
></asp:Textbox>
<img
src="images/buynow_btn.jpg"
width="144"
height="58"
runat="server"
/>
<asp:ImageButton
runat="server"
ID="btnAddToCart"
src="images/addtocart.jpg"
width="144"
height="81"
CommandName="AddToCart"
/>
<asp:Button
runat="server"
ID="Button1"
Text="Add to Cart"
CausesValidation="false"
CommandName="AddToCart"
/>
</ItemTemplate>
</asp:DataList>
CS code
protected void dlProduct_ItemCommand(object source,
DataListCommandEventArgs e)
{
Response.Write("hello");
Response.End();
}