【问题标题】:Persisting User Input for Dynamic Control in SharePoint Web Part为 SharePoint Web 部件中的动态控制保留用户输入
【发布时间】:2010-12-01 02:58:21
【问题描述】:

使用解决方案在底部编辑

我之前看到过与此帖子类似的问题,并尝试了这些建议,但我一定遗漏了一些东西。我的基本问题是:我有一个选择框,用户可以在其中选择一个过滤器,该过滤器可能内置也可能没有约束(要求用户输入更多数据,以便过滤器知道如何过滤)。由于不知道过滤器将存在多少约束,我试图动态加载它们并将它们添加到我拥有的占位符面板中。正确数量的约束加载得很好而且花花公子,但是当用户输入文本并点击提交时,页面重新加载后没有任何值保留。这是适当的代码(如果需要,我可以提供更多):

我将这些作为我的 Web 部件的类变量:

Panel constraintPanel;
HtmlInputText[] constraints;
Label[] constraintLabels = null;

在覆盖 CreateChildControls 中我初始化面板:

constraintPanel = new Panel();

我在重写的 OnPreRender 中构建动态输入框(注意:我听说有人说在 OnInit、OnLoad 或 OnPreRender 中执行此操作,但 OnPreRender 是唯一不会使整个 Web 部件出错的输入框出):

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

private void buildConstraints()
{
    if (!viewSelect.SelectedValue.Equals(INConstants.NoFilterOption))
    {
        string[,] constraintList = docManager.GetFilterConstraints(viewFilterSelect.SelectedValue);
        if (constraintList != null)
        {
            this.constraints = new HtmlInputText[constraintList.Length / 2];
            this.constraintLabels = new Label[constraintList.Length / 2];
            for (int constraintCount = 0; constraintCount < constraintList.Length / 2; constraintCount++)
            {
                Label constraintLabel = new Label();
                constraintPanel.Controls.Add(constraintLabel);
                constraintLabel.Text = constraintList[constraintCount, 0];
                this.constraintLabels[constraintCount] = constraintLabel;

                HtmlInputText constraint = new HtmlInputText();
                constraintPanel.Controls.Add(constraint);
                constraint.ID = "constraint_" + constraintCount;
                constraint.MaxLength = 12;
                constraint.Style.Add("FONT-FAMILY", "Verdana");
                constraint.Style.Add("FONT-SIZE", "11");
                this.constraints[constraintCount] = constraint;
            }
        }
    }
}

最后在我拥有的一个被覆盖的 RenderWebParts 中(注意:我也尝试循环遍历数组约束和约束标签来呈现控件,但没有任何区别):

...
constraintPanel.RenderBeginTag(output); // not sure if this is needed
if (constraints != null && constraints.Length > 0)
{
    foreach (Control tempControl in constraintPanel.Controls)
    {
        if (tempControl is Label)
        {
            output.WriteLine("<tr>");
            output.WriteLine("<td width='2%' nowrap><font class='search-header'>");
            tempControl.RenderControl(output);
            output.WriteLine("&nbsp;");
        }
        else if (tempControl is HtmlInputText)
        {
            tempControl.RenderControl(output);
            output.WriteLine("</td>");
            output.WriteLine("<td width='*' nowrap></td>");
            output.WriteLine("</tr>");
        }
    }
}
constraintPanel.RenderEndTag(output); // not sure if this is needed
...

感谢任何帮助,因为这真的让我发疯了。

使用解决方案编辑:

我已经能够让它工作了。我需要覆盖 OnLoad 事件并将我的调用从那里包装在一个 try-catch 块中。由于某种原因,初始页面加载在尝试运行时会引发异常,从而导致整个页面无法显示。我也忘了将我的约束面板添加到控件列表中。

以下是 OnLoad 中的代码,仅供参考:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    try
    {
        viewsBuildConstraints();
    }
    catch (Exception)
    {
    }
}

【问题讨论】:

    标签: c# sharepoint dynamic controls


    【解决方案1】:

    尝试使用 INamingContainer 界面标记您的 webpart,并确保为所有控件提供一个 ID。此外,我相信 HtmlInput 控件没有视图状态,这会导致它们在回发后“忘记”输入。您可以尝试使用实际的 TextBox 控件吗?

    【讨论】:

    • 我实际上最终为输入框提供了唯一的 ID。我发现它们确实保存状态,我只是在错误的时间构建它们。我已经编辑了我的问题以反映这一点。
    • 很高兴看到您找到了解决方法。虽然它看起来确实像一个快速修复......我鼓励你在有时间的时候更深入地挖掘......
    • 我有一个类似的问题,TextBox 控件没有保留它们的状态。只需添加 INamingContainer 即可。
    猜你喜欢
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 2014-06-26
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2013-02-27
    相关资源
    最近更新 更多