我有一个自定义的NewItem.aspx,我是通过从现有的创建一个新的aspx来创建的
我想在XSL模板中连续放置一个控件,如下所示
<asp:DropDownList ID="ddlSectors" AutoPostBack="true" runat="server" __designer:bind="{ddwrt:DataBind('i',ddlSectors,'SelectedValue','TextChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Sector')}">
</asp:DropDownList>
<!--<SharePoint:FormField runat="server" id="ff7{$Pos}" ControlMode="New" FieldName="Sector" __designer:bind="{ddwrt:DataBind('i',concat('ff7',$Pos),'Value','ValueChanged','ID',ddwrt:EscapeDelims(string(@ID)),'@Sector')}"/>-->
<SharePoint:FieldDescription runat="server" id="ff7description{$Pos}" FieldName="Sector" ControlMode="New"/>
现在我想从我的代码库中引用ddlSectors,但它总是抛出一个未设置为对象instatnce的对象引用。
我相信这是因为控件在XSL模板中。
那么有没有解决方法?
感谢
答案 0 :(得分:0)
问题:每行都显示下拉列表吗?
但您可以尝试引用父控件并使用Control.FindControl方法来获取该控件。
但是,如果您不确切知道哪个控件可能是父控件,则可以编写自定义FindControlRecursive方法来搜索该控件,无论在哪里。
using System.Web.UI;
namespace MyNamespace
{
public static class ControlExtensions
{
public static T FindControlRecursive<T>(this Control parentControl, string id) where T : Control
{
T ctrl = default(T);
if ((parentControl is T) && (parentControl.ID == id))
return (T)parentControl;
foreach (Control c in parentControl.Controls)
{
ctrl = c.FindControlRecursive<T>(id);
if (ctrl != null)
break;
}
return ctrl;
}
}
然后拨打FindControlRecursive<DropDownList>("ddlSectors")
。
答案 1 :(得分:0)
感谢Janis
你的想法激励了我。
但这是适用于我的功能
Control FindControl2(ControlCollection col,string desiredID)
{
Control found=default(Control);
if (found != null)
return found;
for (int i = 0; i < col.Count; i++)
{
Control temp = col[i];
if (temp != null)
{
if (temp.ID != null)
{
if (temp.ID == desiredID)
{
found = temp;
break;
}
else
{
if (found != null)
return found;
else
found=FindControl2(temp.Controls, desiredID);
}
}
else
{
if (found != null)
return found;
else
found = FindControl2(temp.Controls, desiredID);
}
}
}
return found;
}
我用过它并且有效
感谢