问候StackOverflow,
TL,博士
在字段模板控件的OnLoad方法中,我如何通过属性或列名找到FormView中其他字段的Data control。
结束TL;博士
我试图添加一些逻辑到Boolean_Edit字段模板,以便如果绑定到它的属性有一个新的属性,我使模板将注入JavaScript。JavaScript的目的是禁用在属性的ControlledFieldNames
属性中列出的列/属性名的所有数据控件。
这有点令人困惑,所以我将分享一些代码。
下面是我为this创建的属性类:
/// <summary>
/// Attribute used to insert javascript into an ASP.NET web page that uses Dynamic Controls so that if the field's value changes it disables (or enables)
/// other web controls on the page which correspond to the other bound property names.
/// </summary>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, Inherited = false, AllowMultiple = true)]
public sealed class InputRestrictorFieldAttribute : Attribute
{
public Boolean TargetEnabledState { get; set; }
public String[] ControlledFieldNames { get; set; }
public InputRestrictorFieldAttribute(Boolean targetEnabledState, params String[] controlledFieldNames)
{
this.TargetEnabledState = targetEnabledState;
this.ControlledFieldNames = controlledFieldNames;
}
}
所以我可能在一些脚手架类中有一个属性,像这样:
[ScaffoledTable(true)]
public class Person
{
/* Other properties... */
[InputRestrictorFieldAttribute(false, new String[]
{
"StreetAddress",
"City",
"State",
"Zip"
})]
public Boolean AddressUnknown { get; set; }
public String SteetAddress { get; set; }
public String City { get; set; }
public String State { get; set; }
public String Zip { get; set; }
/* some more code */
}
现在在boolean . edit . asx .cs文件中,我试图检查当前支架属性是否具有InputRestrictorFieldAttribute
,如果是这样,则将JavaScript注入页面,以便在AddressUnknown
CheckBox控件检查时禁用StreetAddress
, City
, State
和Zip
的TextBox控件。
下面是我最近尝试的。
protected override void OnLoad(EventArgs e)
{
var attributes = this.Column.Attributes;
foreach (Attribute attr in attributes)
{
if (attr is InputRestrictorFieldAttribute)
{
InputRestrictorFieldAttribute restrictor = (InputRestrictorFieldAttribute)attr;
String restrictorScriptFunctionName = String.Format(RESTRICTOR_SCRIPT_FUNCTION_NAME, ClientID);
String restrictorScript = String.Format(RESTRICTOR_SCRIPT_TEMPLATE_ONCLICK,
restrictorScriptFunctionName,
restrictor.BoundFieldNames.Aggregate("", (aggr, item) =>
{
var bc = this.NamingContainer.BindingContainer;
var ctrl = bc.FindFieldTemplate(item);
return aggr + String.Format(RESTRICTOR_SCRIPT_TEMPLATE_ELEMENT, ctrl.ClientID);
}));
Page.ClientScript.RegisterStartupScript(Page.GetType(), "restrictorScript_" + ClientID, restrictorScript, true);
CheckBox1.Attributes.Add("onchange", restrictorScriptFunctionName + "(this);");
}
}
base.OnLoad(e);
}
现在我知道做的事情,如获得this.NamingContainer.BindingContainer
许多不(或可能不会)在其他页面工作,但现在(在插入的上下文中)。Aspx页面模板)工作。this.NamingContainer.BindingContainer
是Insert的FormView1
控件。aspx页面。但是到目前为止,我所尝试的一切都是通过属性名获得各种数据控件或字段模板或动态控件,它总是返回null或抛出异常。
最后,aggregate方法只是将JavaScript片段连接在一起,以便使用一个JavaScript函数禁用所有控件。这些脚本的内容对这个问题并不重要。
有一个名为FindFieldTemplate的扩展方法请看这里