我在ASP及其生命周期中经常出现问题,即在Page_Load事件引发之前捕获事件。 例如,这里我是自定义gridview,它继承自gridView类。 我添加一个下拉列表来选择要跳转的页面(PageIndexChanged)。一切都会很棒,除了在我渲染之后调用此下拉列表的SelectedIndexChanged事件(网格和我的下拉列表在每次回发时重新生成)。所以我无法在其中选择正确的值。
所以我的赛事只在第二次回发时被提出,我总是迟到一次。
在RowCreated事件中添加了该下拉列表。我尝试了其他事件,但是它是否太晚或太早(如果太晚则没有渲染,如果太早则缺少元素)。
任何解决方案?
PS:我发现this article可以帮助我,但我不知道如何做到这一点:
在进行控制或继承/延伸时要考虑的要点:
- 您必须通过覆盖调用的CreateChildControls来创建要引发事件的任何项目 base.CreateChildControls(),然后做你想做的任何事情(即添加行 你的情况)。
- 列出项目DataBinding你呈现的方式非常......非犹太人......你应该通过重写DataBind()来简化它 清除子项,然后调用EnsureChildControls(),然后添加新项 行...这种方式很好地ViewStated,持久化和事件管理。 更简单。
- 再次列出项目:不要过早创建子项:避免直接在OnInit或onLoad中创建子控件。它是 错误。最好的方法是让系统调用EnsureChildControls 它需要(它将在PreRender首页加载时,在PostBack上, 如果它有儿童的事件,请在OnInit之后调用它......在 更糟糕的是,让OnInit,OnLoad调用EnsureChildControls()。
醇>
答案 0 :(得分:1)
您所访问的msdn页面是ASP.NET Page Life Cycle Overview,它有一个有用的表格,告诉您在页面生命周期中发生的所有事件。
您可能需要以下其中一项(来自上述链接):
<强> PreInit 强>
在开始阶段完成之后和初始化阶段开始之前引发。
将此事件用于以下事项:
<强>初始化强>
在初始化所有控件并应用任何皮肤设置后触发。单个控件的Init事件发生在页面的Init事件之前。
使用此事件来读取或初始化控件属性。
<强> InitComplete 强>
在页面初始化阶段结束时引发。 Init和InitComplete事件之间只发生一次操作:打开视图状态更改的跟踪。视图状态跟踪使控件能够持久保存以编程方式添加到ViewState集合的任何值。在打开视图状态跟踪之前,添加到视图状态的任何值都会在回发中丢失。控件通常会在提升其Init事件后立即打开视图状态跟踪。
使用此事件对您希望确保在下一次回发后保留的视图状态进行更改。
<强>预加载强>
在页面加载自身和所有控件的视图状态之后,以及在处理Request实例包含的回发数据之后,引发。
答案 1 :(得分:0)
好吧,最后看来,由于我上面给出的文章 and this one以及大量搜索,我解决了我的问题:
public class MyGridView : GridView
{
TextBox txtSearch;
protected override int CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding)
{
int numRows = base.CreateChildControls(dataSource, dataBinding);
// Create a new row
GridViewRow rowSearch = base.CreateRow(-1, -1, DataControlRowType.DataRow, DataControlRowState.Normal);
//convert the existing columns into an array, initialize and then add the row to the previously created table
DataControlField[] fields = new DataControlField[this.Columns.Count];
this.Columns.CopyTo(fields, 0);
this.InitializeRow(rowSearch, fields);
TableCell cellSearch = new TableCell();
rowSearch.Cells.Add(cellSearch);
txtSearch = new TextBox();
txtSearch.Text = this.SearchTextboxDefaultValue;
txtSearch.ID = "txtSearch";
txtSearch.AutoPostBack = true;
txtSearch.TextChanged += new EventHandler(txtSearch_TextChanged);
cellSearch.Controls.Add(txtSearch);
this.Controls[0].Controls.Add(rowSearch); // Controls[0] is a Table element
return numRows;
}
protected void txtSearch_TextChanged(object sender, EventArgs e)
{
string search = (sender as TextBox).Text;
DataTable dt = new DataTable();
// We fill in dt with results, and rebind it
this.DataSource = dt;
this.DataBind();
}
}
在Page.cs:
private DataTable dt;
protected void Page_Load(object sender, EventArgs e)
{
sampleDataTable();
if (!Page.IsPostBack)
{
myGrid.DataSource = dt;
myGrid.DataBind();
}
}
private void sampleDataTable()
{
// Populate the dataTable
}
谢谢