我使用Itemplate创建了一个动态网格视图。现在我还在网格中创建了一个动态下拉列表。如何在selectedindexchange上创建事件处理程序。
我创建了一个slectedindexchange事件,但它没有用。控件永远不会传递给事件?
做什么创建一个事件处理程序
public class DynamicGridViewTextTemplate : ITemplate
{
string _ColName;
DataControlRowType _rowType;
int _Count;
details Details1 = new details();
public DynamicGridViewTextTemplate(string ColName, DataControlRowType RowType)
{
_ColName = ColName;
_rowType = RowType;
}
public DynamicGridViewTextTemplate(DataControlRowType RowType, int ArticleCount)
{
_rowType = RowType;
_Count = ArticleCount;
}
public void InstantiateIn(System.Web.UI.Control container)
{
switch (_rowType)
{
case DataControlRowType.Header:
Literal lc = new Literal();
lc.Text = "<b>" + _ColName + "</b>";
DropDownList ddl = new DropDownList();
ddl.AutoPostBack = true;
ddl.SelectedIndexChanged += new EventHandler(this.ddl_SelIndexChanged);
container.Controls.Add(lc);
container.Controls.Add(ddl);
break;
case DataControlRowType.DataRow:
//Label lbl = new Label();
//lbl.DataBinding += new EventHandler(this.lbl_DataBind);
LinkButton lb = new LinkButton();
lb.DataBinding += new EventHandler(this.lbl_DataBind);
lb.OnClientClick +=new EventHandler(this.lb_Click);
//lbl.Controls.Add(lb);
container.Controls.Add(lb);
break;
case DataControlRowType.Footer:
Literal flc = new Literal();
flc.Text = "<b>Total No of Articles:" + _Count + "</b>";
container.Controls.Add(flc);
break;
default:
break;
}
}
private void lb_Click(Object sender, EventArgs e)
{
details1.lbl_Click(sender, e);
}
private void lbl_DataBind(Object sender, EventArgs e)
{
//Label lbl = (Label)sender;
LinkButton lbl = (LinkButton)sender;
GridViewRow row = (GridViewRow)lbl.NamingContainer;
lbl.Text =DataBinder.Eval(row.DataItem, _ColName).ToString();
}
public void ddl_SelIndexChanged(Object sender, EventArgs e)
{
Details1.ddlFilter_SelectedIndexChanged(sender,e);
}
}
答案 0 :(得分:3)
您可以像这样声明selectedindexchanged事件:
ddlFilter.SelectedIndexChanged += new EventHandler(ddl2_SelectedIndexChanged);
ddlFilter.AutoPostBack = true;
void ddlFilter_SelectedIndexChanged(object sender, EventArgs e)
{
//your code
}
未调用事件的原因是AutoPostBack = true字段。如果未将其设置为true,则永远不会调用selectedIndexChanged事件。
答案 1 :(得分:0)
每当我在ASP网页中创建一个新控件时,我都会按照这个样板进行操作(注意我添加了一些示例控件,因此它不是一个“干净”的锅炉板):
namespace Components {
[ToolboxData("<{0}:MyControl runat=server></{0}:MyControl>")]
public class MyControl : WebControl, INamingContainer {
// todo: add controls that are created dynamically
private GridView gridView;
public MyControl () {
Initialize();
}
[Browsable(false)]
public override ControlCollection Controls {
get { EnsureChildControls(); return base.Controls; }
}
protected override void OnLoad(EventArgs e) {
// todo: attach event listeners for instance
base.OnLoad(e);
}
protected override void CreateChildControls() {
Initialize();
}
protected override void Render(HtmlTextWriter writer) {
if (DesignMode) {
// If special design mode rendering
return;
}
base.Render(writer);
}
/// This is where the controls are created
private void Initialize() {
base.Controls.Clear();
// todo: Create all controls to add, even those "added later"
// if something is generated but should not be shown,
// set its Visible to false until its state is changed
Label exampleLabel = new Label();
exampleLabel.Visible = false; // like so
if (gridView == null) { gridView = new GridView(); }
base.Controls.Add(exampleLabel);
base.Controls.Add(gridView);
}
}
}
现在,如果您在Initialize中创建动态下拉菜单,并且每次都将其添加到您的Controls集合中,但只在您希望它显示时将Visibility
设置为true
,则应触发您的事件,因为你的控件的id在回发之间应该是相同的。
答案 2 :(得分:0)
要发生动态控件的事件,需要在page_load事件中或在page_load事件发生期间创建事件并分配事件。在Page_Load事件完成后,将触发Control的事件。如果未在page_load事件中重新创建控件,则事件将不会绑定到控件,也不会触发。
答案 3 :(得分:0)
我遇到了同样的问题,我在里面创建了动态ddl(!Page.IsPostBack)。当我将创作移到(!Page.IsPostBack)之外时,它工作正常。
你必须在(!Page.IsPostBack)之外创建你的元素,就像MUG4N所说的那样,它应该可以正常工作。