【发布时间】: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(" ");
}
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