0

인사에 StackOverflow,ASP.NET 동적 데이터 : 열 이름을

TL 사용하여 FormView에서 DynamicControl의 데이터 컨트롤을 찾아, 나는 다른 필드의 데이터 컨트롤을 찾을 수있는 방법 필드 템플릿 컨트롤의 온로드 방법에서 DR

을 속성 또는 열 이름별로 FormView에 저장합니다.

END TL;

Boolean_Edit 필드 템플릿에 일부 로직을 추가하려고합니다. 그래야 속성에 바인딩 된 속성에 새 속성이 있으면 템플릿이 자바 스크립트를 삽입합니다. 자바 스크립트는 속성의 ControlledFieldNames 속성에 나열된 열/속성 이름의 모든 데이터 컨트롤을 사용하지 않도록 설정되었습니다.

이것은 다소 혼란 스럽기 때문에 몇 가지 코드를 알려 드리겠습니다.

/// <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; 
    } 
} 

그래서 내가 지금처럼 일부 스캐 폴딩 클래스의 속성이 있습니다 다음 Boolean_Edit.ascx.cs 파일에 지금

[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 */ 
} 

을 여기

내가이 위해 만든 속성 클래스입니다 현재 scaffold 속성에 InputRestrictorFieldAttribute이 있는지 확인하려고하는데 페이지에 JavaScript를 삽입하면 AddressUnknown CheckBox 컨트롤이 선택되어 있지 않은 경우 StreetAddress,에 대한 TextBox 컨트롤이 비활성화됩니다., StateZip.

다음은 최근에 시도한 내용입니다.

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); 
    } 

지금 내가합니다 (Insert.aspx 페이지 템플릿의 맥락에서) 다른 페이지에하지만 지금의 this.NamingContainer.BindingContainer 많지 않다 (또는 아마 실 거예요) 작업을 받고 같은 일을 알고 작동합니다. this.NamingContainer.BindingContainer은 Insert.aspx 페이지의 FormView1 컨트롤입니다. 하지만 지금까지 다양한 데이터 dontrols 또는 필드 템플릿을 얻으려고했거나 속성 이름으로 동적 컨트롤을 사용하면 항상 null이 반환되거나 예외가 throw됩니다.

마지막으로 집계 방법은 자바 스크립트 조각을 연결하여 모든 컨트롤이 하나의 JavaScript 함수를 사용하여 비활성화되도록하는 것입니다. 이 스크립트의 내용은이 질문에 중요하지 않습니다.

답변

관련 문제