请教关于webpart自定义属性无法保存值?

xiaoh2008_today 2010-11-29 03:05:55
大家好!
我要实现webpart属性的自定义,比如,在属性界面里面添加一个dropdownlist,每次改变选择值之后,点击“应用”,能将新的值传给webpart的属性name.问题是,每次点“应用”页面postback后,dropdownlist都会变回第一个值,而页面上也是dropdownlist的第一个值,值的改变并没有生效。
我的实现如下:
在webpart.cs中属性name声明如下:
[Personalizable (PersonalizationScope.Shared)]
[ WebBrowsable (false)] //为了使用自定义的属性界面而不使用默认界面,将其设为false
[ WebDisplayName ("Personalize text data")]
[ WebDescription ("this text box is a personalized webpart")]
public string name { get;set;}
同时,重写了IWebEditable接口:
public override EditorPartCollection CreateEditorParts()
{
ArrayList controlList = new ArrayList();
WebPartEditor ePart = new WebPartEditor();
ePart.ID = this.ID + Guid.NewGuid().ToString();
ePart.Title = "EditorPartTest";
controlList.Add(ePart);
EditorPartCollection baseParts=base.CreateEditorParts ();
return new EditorPartCollection(baseParts, controlList);
}
//////以上是在webpart.cs中实现的
/////以下继承EditorPart写了WebPartEditor.cs
protected override void CreateChildControls()
{
ddl_Text = new DropDownList();
ddl_Text.Items.Add("姓名1");
ddl_Text.Items.Add("姓名2");
Controls.Add(ddl_Text);
}
public override bool ApplyChanges()
{
this.EnsureChildControls();
VisualWebPart1 webPart = WebPartToEdit as VisualWebPart1;
if (webPart != null)
{
webPart.name = this.ddl_Text.SelectedValue;
}
return true;
}
public override void SyncChanges()
{
this.EnsureChildControls();
VisualWebPart1 webPart = WebPartToEdit as VisualWebPart1;
if (webPart != null )
{
this.ddl_Text.SelectedValue = webPart.name;
}

}

我发现每次点击“应用”,WebPartEditor.cs中的CreateChildControls()都会被重新执行一次,也就是dropdownlist控件会重新被创建,原来选择值并没有被保存。

请问有什么办法可以解决这个问题呢?
...全文
395 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jenny0810 2010-12-17
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xiaoh2008_today 的回复:]
各位,我想我找到答案了。
ePart.ID = this.ID + Guid.NewGuid().ToString();
问题出在这条代码上,Guid.NewGuid()随机产生的ID是的每次创建的EitorPart控件都是新控件,原值不被保存-_-|||
谢谢大家!
[/Quote]Good for you
xiaoh2008_today 2010-12-03
  • 打赏
  • 举报
回复
各位,我想我找到答案了。
ePart.ID = this.ID + Guid.NewGuid().ToString();
问题出在这条代码上,Guid.NewGuid()随机产生的ID是的每次创建的EitorPart控件都是新控件,原值不被保存-_-|||
谢谢大家!
xiaoh2008_today 2010-12-03
  • 打赏
  • 举报
回复
不是的,创建的web part 和visual web part都是继承于System.Web.UI.WebControls.WebParts,不是Microsoft.SharePoint.WebPartPages.WebPart。
[Quote=引用 10 楼 yun_liang1028 的回复:]
这应该跟你创建webpart时,类继承的对象有关系,
你创建的web part 继承的可能是Microsoft.SharePoint.WebPartPages.WebPart
[/Quote]
Oo云 2010-12-02
  • 打赏
  • 举报
回复
这应该跟你创建webpart时,类继承的对象有关系,
你创建的web part 继承的可能是Microsoft.SharePoint.WebPartPages.WebPart
xiaoh2008_today 2010-12-02
  • 打赏
  • 举报
回复
两者都是继承于System.Web.UI.WebControls.WebParts,跟命名空间有关吗?

[Quote=引用 8 楼 reejayyang 的回复:]
引用 7 楼 xiaoh2008_today 的回复:
事实证明,将Visual Web Part模板改成Web Part,代码不需要改动,就可以了。。。晕
没搞明白Visual Web Part除了增加ascx控件及可视化设计之外与web part有什么本质区别?为什么会导致Editor Part出现这种问题?


引用 6 楼 yun_liang1028 的回复:
汗,
那你在试……
[/Quote]
reejayyang 2010-12-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xiaoh2008_today 的回复:]
事实证明,将Visual Web Part模板改成Web Part,代码不需要改动,就可以了。。。晕
没搞明白Visual Web Part除了增加ascx控件及可视化设计之外与web part有什么本质区别?为什么会导致Editor Part出现这种问题?


引用 6 楼 yun_liang1028 的回复:
汗,
那你在试试
ddl_Text.AutoPostBack = tr……
[/Quote]它们的命名空间不同
xiaoh2008_today 2010-11-30
  • 打赏
  • 举报
回复
事实证明,将Visual Web Part模板改成Web Part,代码不需要改动,就可以了。。。晕
没搞明白Visual Web Part除了增加ascx控件及可视化设计之外与web part有什么本质区别?为什么会导致Editor Part出现这种问题?

[Quote=引用 6 楼 yun_liang1028 的回复:]
汗,
那你在试试
ddl_Text.AutoPostBack = true
[/Quote]
Oo云 2010-11-29
  • 打赏
  • 举报
回复
汗,
那你在试试
ddl_Text.AutoPostBack = true
xiaoh2008_today 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 yun_liang1028 的回复:]
在这个方法CreateChildControls()
最上面
加个 这个 试下
if (this.Page.IsCallback) return;
[/Quote]

如果加if(!ispostback)
protected override void CreateChildControls()
{
if(!ispostback)
{
ddl_Text = new DropDownList();
ddl_Text.Items.Add("姓名1");
ddl_Text.Items.Add("姓名2");
Controls.Add(ddl_Text);
}
}
则在执行SyncChanges()中的this.EnsureChildControls()时候会发现ddl控件未创建,重新创建。否则提示“未将对象引用设置到对象的实例”
++++++++++++++++++++++++++
如果加if (this.Page.IsCallback) return;
protected override void CreateChildControls()
{
if (this.Page.IsCallback) return;
ddl_Text = new DropDownList();
ddl_Text.Items.Add("姓名1");
ddl_Text.Items.Add("姓名2");
Controls.Add(ddl_Text);
}
这条语句完全不执行,设置断点,发现this.Page.IsCallback一直为false
Oo云 2010-11-29
  • 打赏
  • 举报
回复
在这个方法CreateChildControls()
最上面
加个 这个 试下
if (this.Page.IsCallback) return;
Justin-Liu 2010-11-29
  • 打赏
  • 举报
回复
你在哪指定的这个属性 就在哪加
xiaoh2008_today 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yun_liang1028 的回复:]
if(!ispostback)
{
}
[/Quote]

我想过if(!ispostback),但是不知应该把它往哪放?
如果是放在WebPartEditor.cs中的CreateChildControls()里的话,会出现控件没有被创建而出错的提示。
请问应该放在哪呢?
Oo云 2010-11-29
  • 打赏
  • 举报
回复
if(!ispostback)
{
}

3,242

社区成员

发帖
与我相关
我的任务
社区描述
企业开发 SharePoint
社区管理员
  • SharePoint社区
  • 霖雨
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧