如何在Page_Load之前捕获事件

时间:2013-03-07 09:38:53

标签: c# events lifecycle

我在ASP及其生命周期中经常出现问题,即在Page_Load事件引发之前捕获事件。 例如,这里我是自定义gridview,它继承自gridView类。 我添加一个下拉列表来选择要跳转的页面(PageIndexChanged)。一切都会很棒,除了在我渲染之后调用此下拉列表的SelectedIndexChanged事件(网格和我的下拉列表在每次回发时重新生成)。所以我无法在其中选择正确的值。

所以我的赛事只在第二次回发时被提出,我总是迟到一次。

在RowCreated事件中添加了该下拉列表。我尝试了其他事件,但是它是否太晚或太早(如果太晚则没有渲染,如果太早则缺少元素)。

任何解决方案?

PS:我发现this article可以帮助我,但我不知道如何做到这一点:

  

在进行控制或继承/延伸时要考虑的要点:

     
      
  1. 您必须通过覆盖调用的CreateChildControls来创建要引发事件的任何项目   base.CreateChildControls(),然后做你想做的任何事情(即添加行   你的情况)。
  2.   
  3. 列出项目DataBinding你呈现的方式非常......非犹太人......你应该通过重写DataBind()来简化它   清除子项,然后调用EnsureChildControls(),然后添加新项   行...这种方式很好地ViewStated,持久化和事件管理。   更简单。
  4.   
  5. 再次列出项目:不要过早创建子项:避免直接在OnInit或onLoad中创建子控件。它是   错误。最好的方法是让系统调用EnsureChildControls   它需要(它将在PreRender首页加载时,在PostBack上,   如果它有儿童的事件,请在OnInit之后调用它......在   更糟糕的是,让OnInit,OnLoad调用EnsureChildControls()。
  6.   

2 个答案:

答案 0 :(得分:1)

您所访问的msdn页面是ASP.NET Page Life Cycle Overview,它有一个有用的表格,告诉您在页面生命周期中发生的所有事件。

您可能需要以下其中一项(来自上述链接):

<强> PreInit

在开始阶段完成之后和初始化阶段开始之前引发。

将此事件用于以下事项:

  • 检查IsPostBack属性以确定这是否是第一次处理页面。此时还设置了IsCallback和IsCrossPagePostBack属性。
  • 创建或重新创建动态控件。
  • 动态设置母版页。
  • 动态设置Theme属性。
  • 读取或设置个人资料属性值。

<强>初始化

在初始化所有控件并应用任何皮肤设置后触发。单个控件的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
}

谢谢