首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SharePoint web部件中CreateChildControls()和ApplyChanges()方法的调用顺序

SharePoint web部件中CreateChildControls()和ApplyChanges()方法的调用顺序
EN

Stack Overflow用户
提问于 2009-07-23 07:35:40
回答 4查看 9.5K关注 0票数 4

我正在为SharePoint创建一个web部件。我有一个自定义编辑器部分,它覆盖了SyncChanges()和ApplyChanges()方法(以及其他方法)。

问题是,当我在编辑模式下单击OK时,页面将切换到浏览模式,但在EditorPart中更改并保存在ApplyChanges()方法中的数据(属性)不会更新。我必须再次“进入页面”(重新加载而不再次POSTing数据)才能看到所做的更改。

我对它进行了调试,并弄清楚了它在做什么--在编辑模式下单击OK后,首先调用WebPart.CreateChildControls(),然后调用EditorPart.ApplyChanges()。因此,数据已更新,但显示的是未更新的数据。

我在这个行为中发现了另外一些东西:在CreateChildControls()中向我的WebPart添加一个特定的控件会导致调用WebPart.CreateChildControls()和EditorPart.ApplyChanges()的顺序错误。在我的例子中,它会导致添加WebDataTree或UltraWebTree控件(来自Infragistics),但它也可能发生在常见的ASP.NET TextBox中(正如这里详细描述的相同问题:ASP.net forum thread)。

因此,如果我添加树,首先调用CreateChildControls(),然后调用ApplyChanges,所以它不是实际的。我必须刷新才能看到我在编辑器部分中所做的更改。

如果我注释将树添加到controls集合,则首先调用ApplyChanges,然后一切正常(除了我需要该树: ) ...

有人知道是什么导致了这种奇怪的行为吗?

EN

回答 4

Stack Overflow用户

发布于 2010-01-04 19:21:40

调用方法和事件的顺序如下: CreateChildControls ApplyChanges OnPreRender

因此,如果您访问CreateChildControls中的属性,则它们不是最新的。因此,我将访问the部件属性的代码从CreateChildControls迁移到了OnPreRender,一切都正常工作。

票数 4
EN

Stack Overflow用户

发布于 2009-07-23 12:01:54

我不确定这是否是您遇到的问题,但是我遇到的一个问题看起来有点类似,所以我将在这里描述它和我的解决方案。

我的编辑器部件与某些类型的UI控件(即下拉列表)之间存在同步问题。我的问题是,我的web部件属性有下拉值/键,但是当我构建编辑器部件时,当SynchChanges()被调用时,它还没有下拉列表项,所以我不能在那个时候设置我的下拉值。我通过使用同步成员变量来处理这个问题,如下所示。

代码语言:javascript
复制
private DropDownList _dropDownList;
private string _syncDropDownId;

public override SyncChanges()
{
    // This will make sure CreateChildControls() is called
    // but that doesn't help me with my drop down list data
    // which is loaded in OnPreRender()
    this.EnsureChildControls();

    MyWebPart webPart = this.WebPartToEdit as MyWebPart;

    // Temporarily store the drop down value for now
    // since our drop down is not fully built yet
    _syncDropDownId = myWebPart.SomeId;
}

protected override void CreateChildControls()
{
    base.CreateChildControls();

    // Create our drop down list, but don't populate it yet
    _dropDownList = new DropDownList();
    this.Controls.Add(_dropDownList);
}

protected override void OnPreRender(EventArgs e)
{
    base.OnPreRender(e);

    // Load drop down list items
    _dropDownList.Items.AddRange(GetListItems());

    // Select item in drop down list based on web part property
    if (_syncDropDownId != null)
    {
        if (_dropDownList.Items.FindByValue(_syncDropDownId) != null)
        {
            _dropDownList.SelectedValue = _syncDropDownId;
        }
        _syncDropDownId = null;
    }
}
票数 2
EN

Stack Overflow用户

发布于 2009-12-23 22:42:40

您可以使用以下命令强制刷新页面:

Page.Response.Redirect(Page.Request.Url.ToString());

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1170222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档