1

我对 asp.net lifecylce 层次结构有疑问。

基本上,我有一个用户控件,其中有一个 GridView。并且这个 GridView 是基于控件上的公共属性(在下面的简化代码中名为 Parameter)动态生成的。

当我将此控件插入 aspx 页面、设置其 Parameter 属性并在其上调用 DataBind(Parameter) 时,一切都很好。GridView 在 UI 上生成并填充。

当我回发页面时出现问题。我必须重新生成 GridView 结构,以便控件的 ViewState 中的数据可以用于填充 GridView。这样我才能实现它的内容。但只要 GridView 结构是动态生成的,并且是基于其上设置的 Parameter 属性,这是不可能的。因为用户控件的 OnInit 在页面的 OnInit 之前被调用,这就是为什么在 GridView 结构生成之后设置 Parameter 属性的原因。结果,我最后得到了一个空的 Gridview。

这是简化的代码。

你能给我一些建议如何克服这个问题吗?

我可以明确强制 asp.NET 重新加载 gridview 的 ViewState 吗?

Page HomePage.aspx有一个OnInit 事件处理程序,它设置用户控件ctlMyUSerControl属性

protected override void OnInit(EventArgs e)
    {

              ctlMyUserControl.Parameter = new Parameter()
                       name="Orhan",
                       surname= "Pamuk"};

        }

ctlMyUserControl的 OnInit 我有

    protected override void OnInit(EventArgs e)
{
        if (Page.IsPostBack && Parameter !=null && SomeGridViewRowsExistOnUI)
        {
                        // Generate dynamic columns based on Parameter property
                        // So that gridview can be populated 
                       // with the post-backed data which 
                        // should contain the ViewState of the gridview 
                       GenerateGridViewColumns(Parameter);
        }

    base.OnInit(e);
}
4

1 回答 1

1

我已经卖掉了伙计们。

我所做的是在用户控件的容器页面上重新生成我的 GridView 列。

因此,在页面的 OnInit 上,我重新生成了列,它仍然在调用 LoadViewState() 方法之前。

protected override void OnInit(EventArgs e)
    {

              Parameter parameter = new Parameter()
                       name="Orhan",
                       surname= "Pamuk"};

               ctlMyUserControl.GenerateGridViewColumns(parameter);


        }
于 2010-06-30T08:50:47.007 回答