SharePoint 2010 Web控件 - 未在回发时设置LookupField值

时间:2011-02-01 11:40:40

标签: sharepoint sharepoint-2010

我已经在VS2010中创建了一个自定义编辑表单(继承自LayoutsPageBase),该页面使用SharePoint Web控件LookupField控件显示自定义类型的值下拉列表

使用包含预期值范围的下拉框正确显示表单

ControlMode设置为与FormContext相同(尽管我已尝试将其设置为“编辑”)

但是在回发中没有设置下拉列表的值 - 所选项目索引设置为-1

如何正确使用LookupField控件从用户捕获选定的值?

可能是因为我在aspx中明确地添加控件,然后在页面加载事件中从SPContext设置列表ID等吗? - 请参阅下面的代码段(不是最漂亮但只是试图让它在此时工作):

来自aspx:

<SharePoint:FileField ID="FileNameText"  InputFieldLabel="Name" runat="server" ControlMode="Display"/><br />
<SharePoint:LookupField ID="FeedType" runat="server" />
<SharePoint:TextField ID="FeedStatus" runat="server"  />

...

在代码隐藏页面加载:

if (!IsPostBack)
            {
                SPItem feedFileItem = SPContext.Current.Item;
                FileNameText.ControlMode = SPContext.Current.FormContext.FormMode;
                FileNameText.ListId = SPContext.Current.ListId;
                FileNameText.ItemId = SPContext.Current.ItemId;
                FileNameText.FieldName = "Name";

                FeedType.ControlMode = SPControlMode.Edit;

                FeedType.ListId = SPContext.Current.ListId;
                FeedType.ItemId = SPContext.Current.ItemId;
                FeedType.FieldName = "FeedType";

                FeedStatus.ItemContext = SPContext.Current;
                FeedStatus.RenderContext = SPContext.Current;
                FeedStatus.ControlMode = SPControlMode.Edit;
                FeedStatus.ListId = SPContext.Current.ListId;
                FeedStatus.ItemId = SPContext.Current.ItemId;
                FeedStatus.FieldName = "FeedStatus";
            }

更新

好的,我设法通过在CreateChildControls的覆盖中添加代码中的控件来使我的表单工作 - 这与我在网上看到的大多数样本一致。

但有人可以解释为什么我的方法不起作用以及我是否可以在aspx中以声明的方式完成所有这些工作?

1 个答案:

答案 0 :(得分:2)

在回发期间,如果未填充列表控件,则会忽略列表中的选定值。因此,如果您选择第2项并且列表项为空,则它将忽略响应参数而不设置Value属性。这是因为ProcessPostData发生在LoadData之前。即使您要删除LoadData方法上的!IsPostBack,它仍然无法工作,因为ProcessPostData仍然在LoadData之前发生,并且您在处理回发之前没有加载列表。

解决此问题的一种简单方法是将初始化代码移动到应用程序页面的EnsureChildControls方法中。

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

    ...
    FeedType.ControlMode = SPControlMode.Edit;

    FeedType.ListId = SPContext.Current.ListId;
    FeedType.ItemId = SPContext.Current.ItemId;
    FeedType.FieldName = "FeedType";  
    ...
}