如何在Page_Load之前捕获事件

本文关键字:事件 Load Page | 更新日期: 2023-09-27 18:02:37

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

所以我的事件只在第二次回发时引发,我总是延迟一次回发。

这个下拉列表被添加到RowCreated事件中。我在其他事件中尝试过,但它是否太晚或太早(如果太晚则不渲染,如果过早则缺少元素)。

有答案吗?

PS:我发现这篇文章可以帮助我,但我不确定如何做:

控制或继承/扩展时需要考虑的要点:

  1. 你必须创建任何你想通过重写CreateChildControls来引发事件的项目base.CreateChildControls(),然后做任何你想要的(即添加行)你的案子)。
  2. 列表项数据绑定您呈现的方式是高度…非犹太……您应该通过重写DataBind()来简化它,以便它清除子对象,然后调用EnsureChildControls(),然后添加新的行……这种方式很好地实现了viewstate、持久化和事件管理。更加简单。
  3. 再次列出:不要太早创建子控件:避免直接在OnInit或onLoad中创建子控件。这是一个错误。最好是让系统调用EnsureChildControls它需要(它将在PreRender在第一个页面加载,并在PostBack,如果它有子事件,就在OnInit之后调用它)…在更糟糕的是,让OnInit, OnLoad调用EnsureChildControls()。

如何在Page_Load之前捕获事件

您要的msdn页面是ASP。. NET页面生命周期概述,它有一个有用的表格,告诉您在页面生命周期中发生的所有事件。

您可能需要以下内容之一(来自上面的链接):

PreInit

在启动阶段结束后,初始化阶段开始之前引发。

在下列情况下使用此事件:

  • 检查IsPostBack属性以确定这是否是第一次处理该页。IsCallback和IsCrossPagePostBack属性也已经在这个时候设置好了。
  • 创建或重新创建动态控件
  • 动态设置母版页
  • 动态设置主题属性
  • 读取或设置配置文件属性值。

Init

在所有控件初始化并应用任何皮肤设置后引发。单个控件的Init事件发生在页的Init事件之前。

使用此事件读取或初始化控件属性。

InitComplete

在页初始化阶段结束时引发。在Init和InitComplete事件之间只发生一个操作:打开视图状态变化的跟踪。视图状态跟踪使控件能够持久化以编程方式添加到ViewState集合中的任何值。在打开视图状态跟踪之前,添加到视图状态的任何值都会在回发期间丢失。控件通常在引发Init事件后立即开启视图状态跟踪。

使用此事件对视图状态进行更改,以确保在下次回发后持久化。

预加载

在页面加载自身和所有控件的视图状态以及处理Request实例中包含的回发数据之后引发。

好了,多亏了我上面给出的文章和这篇文章,以及大量的搜索,我终于解决了我的问题:

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
}

谢谢