I recently had a need to build a dynamic "form" for a simple database driven search engine. I tried several different approaches and was satisfied with none until I tried using the RadListBox (probably could have used RadListView as well). After spending quite some time trying to figure out how to manipulate the individual controls inside the RadListItems, I stumbled upon the solution and thought I would share. Hope this helps some one out there!
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="SearchUtil.aspx.cs" Inherits="CustomCo.SearchUtil" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title></title></head><body> <form id="form1" runat="server"> <telerik:RadScriptManager ID="RadScriptManager1" runat="server"> </telerik:RadScriptManager> <telerik:RadListBox ID="rlbSearchParams" runat="server" Width="80%" ClientIDMode="Predictable"> <ItemTemplate> <span> <asp:Image ID="imgBlank0" runat="server" ImageUrl="~/Images/Templates/blank0.png" Width="75px" Height="1px" Visible="false" /> <telerik:RadComboBox ID="ddlAndOr" runat="server" Width="75px"> <Items> <telerik:RadComboBoxItem Text="AND" Value="0" /> <telerik:RadComboBoxItem Text="OR" Value="1" /> </Items> </telerik:RadComboBox> <telerik:RadComboBox ID="ddlParamName" runat="server" Width="200px"> <Items> <telerik:RadComboBoxItem Text="Author Name" Value="AuthorName" /> <telerik:RadComboBoxItem Text="Title" Value="Title" /> <telerik:RadComboBoxItem Text="Account Team" Value="AccountTeam" /> </Items> </telerik:RadComboBox> <telerik:RadTextBox ID="txtParamValue" runat="server" Width="200px" /> <asp:Button ID="btnAdd" runat="server" Text="+" CommandName="Add" OnClick="btnAdd_Click" /> <asp:Button ID="btnRemove" runat="server" Text="-" CommandName="Remove" OnClick="btnRemove_Click" /> </span> </ItemTemplate> </telerik:RadListBox> </form></body></html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
namespace CustomCo
{
public partial class AdvancedSearch : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (rlbSearchParams.Items.Count < 1)
CreateForm();
}
private void CreateForm()
{
RadListBoxItem firstItem = new RadListBoxItem();
rlbSearchParams.Items.Add(firstItem);
RadComboBox myAndOR = rlbSearchParams.Items[0].FindControl("ddlAndOr") as RadComboBox;
myAndOR.Visible = false;
Image Spacer = rlbSearchParams.Items[0].FindControl("imgBlank0") as Image;
Spacer.Visible = true;
Button myRemoveButton = rlbSearchParams.Items[0].FindControl("btnRemove") as Button;
myRemoveButton.Visible = false;
myRemoveButton.CommandArgument = "0";
}
protected void btnAdd_Click(object sender, EventArgs e)
{
RadListBoxItem secondItem = new RadListBoxItem();
rlbSearchParams.Items.Add(secondItem);
Button myRemoveButton = rlbSearchParams.Items[0].FindControl("btnRemove") as Button;
myRemoveButton.CommandArgument = (rlbSearchParams.Items.Count - 1).ToString();
Button myPreviousAddButton = rlbSearchParams.Items[(rlbSearchParams.Items.Count - 2)].FindControl("btnAdd") as Button;
myPreviousAddButton.Visible = false;
}
protected void btnRemove_Click(object sender, EventArgs e)
{
Button mySender = (Button)sender;
RadListBoxItem myItem = (RadListBoxItem)mySender.Parent;
if (myItem != null)
{
switch(myItem.Index)
{
case 0:
CreateForm();
break;
case 1:
Button myPreviousAddButton = rlbSearchParams.Items[0].FindControl("btnAdd") as Button;
myPreviousAddButton.Visible = true;
break;
default:
if (rlbSearchParams.Items.Count - 1 == myItem.Index)
{
Button defaultPreviousAddButton = rlbSearchParams.Items[myItem.Index - 1].FindControl("btnAdd") as Button;
defaultPreviousAddButton.Visible = true;
}
if (rlbSearchParams.Items.Count > 1)
{
Button defaultPreviousRemoveButton = rlbSearchParams.Items[myItem.Index - 1].FindControl("btnRemove") as Button;
defaultPreviousRemoveButton.Visible = true;
}
break;
}
rlbSearchParams.Items.Remove(rlbSearchParams.Items[myItem.Index]);
}
}
}
}