Asp.net动态地在PostBack上重新创建列表框
本文关键字:创建 列表 新创建 动态 net PostBack Asp | 更新日期: 2023-09-27 18:12:37
我想创建基于主类别和子类别的动态添加的ListBoxes
,其中它们可以是无限数量的子类别。这个问题我已经研究了一个星期了,但还是没有解决。
我希望它像Ebay的类别选择。当页面加载将有一个列表框与所有主要类别。当用户在列表框中选择一个项目时,应该动态地添加另一个列表框,这样每个列表框中都有选中的项目。因此,在第一个列表框中选择了第一个项目后,应该有两个列表框,第二个列表框显示属于所选项目的所有子类别。
Ebay品类选择示例http://www.aquariumbids.com/Images/ebayCat.JPG
每个请求的代码-我想离上班很近。
public partial class WebForm2 : System.Web.UI.Page
{
private Int32 controlCount = 0;
Panel _panel;
private Panel PanelPlaceholder
{
get
{
if (_panel == null && Master != null)
_panel = pnlContainer;
return _panel;
}
}
protected void Page_PreInit(Object sender, EventArgs e)
{
this.EnsureChildControls();
if (IsPostBack)
{
// Re-create controls but not from datasource
// The controlCount value is output in the page as a hidden field during PreRender.
controlCount = Int32.Parse(Request.Form["controlCount"]); // assigns control count from persistence medium (hidden field)
for (Int32 i = 0; i < controlCount; i++)
{
CreateDynamicControlGroup(false);
}
}
}
protected void Page_Load(Object sender, EventArgs e)
{
// create from data query.
// only if not postback
if (!IsPostBack)
{
int cc = controlCount;
DataTable dt = null;
Dictionary<string, string> Params = new Dictionary<string, string>();
dt = Globals.g_DatabaseHandler.GetRecords(StoredProcedures.GetMainCategories, Params);
// create a set of dynamic controls for the Row, incrementing counter and
// getting a reference to the new controls via their common parent (Dynamic PlaceHolder)
CreateDynamicControlGroup(true);
ListBox lb = (ListBox)PanelPlaceholder.Controls[controlCount - 1];
// On reload you will see that child ListItems are persisted by the DropDownList
lb.DataSource = dt; // use the same table
lb.DataValueField = "ID";
lb.DataTextField = "Name";
lb.DataBind();
}
}
protected void Page_PreRender(Object sender, EventArgs e)
{
// persist control count
ClientScript.RegisterHiddenField("controlCount", controlCount.ToString());
}
private void ListBox_SelectedIndexChanged(Object sender, EventArgs e)
{
ListBox lb = sender as ListBox;
Dictionary<string, string> Params = new Dictionary<string, string>();
Params.Add("parentID", lb.SelectedValue);
DataTable Categories = Globals.g_DatabaseHandler.GetRecords(StoredProcedures.GetChildCategories, Params);
if (Categories.Rows.Count > 0)
{
// create a set of dynamic controls for the Row, incrementing counter and
// getting a reference to the new controls via their common parent (Dynamic PlaceHolder)
CreateDynamicControlGroup(true);
ListBox newLb = (ListBox)PanelPlaceholder.Controls[controlCount - 1];
// On reload you will see that child ListItems are persisted by the DropDownList
newLb.DataSource = Categories; // use the same table
newLb.DataValueField = "ID";
newLb.DataTextField = "Name";
newLb.DataBind();
}
}
private void CreateDynamicControlGroup(Boolean incrementCounter)
{
// Create one logical set of controls do not assign values!
ListBox lb = new ListBox();
lb.AutoPostBack = true;
lb.CssClass = "panel";
PanelPlaceholder.Controls.Add(lb);
// wire event delegate
lb.SelectedIndexChanged += new EventHandler(ListBox_SelectedIndexChanged);
if (incrementCounter)
{
controlCount += 1;
}
}
}
标记:
<div class="Column12" id="Form_NewListing">
<h2 class="h2row">Create Your Listing - Step 1 of 2)</h2>
<h3 class="h3row">Select a category</h3>
<div class="panel">
<asp:Panel ID="pnlContainer" runat="server"></asp:Panel>
</div>
</div>
如果你想在没有回发的情况下完成,这里有一篇文章可能会有所帮助:创建级联下拉列表的步骤。NET AJAX框架http://support.microsoft.com/kb/976156