2009-12-02 2 views
1

사용자 지정 컨트롤을 쓰려고합니다. 나는 그 사용자가 DataSourceId (GridView, Repeater 등과 같이)를 지정할 수 있도록하고 싶다.사용자 지정 컨트롤에서 DataSourceId를 사용합니다.

id에 해당하는 DataSource를 찾을 수 있습니다. 그리고 관련된 DataSourceView를 얻을 수 있습니다. 그러나 데이터를 가져 오는 유일한 방법은 비동기 Select 메서드를 사용하는 것입니다. 물론 콜백을 설정할 때까지 콜백이 발생할 때까지 코드가 차단되도록 콜백을 설정할 수 있습니다. 그러나 이것은 내가 이상한 일을하고 있다고 의심하는 수많은 이상한 회전을 요구합니다.

다른 ASP.NET 데이터 컨트롤과 같이 컨트롤이 작동하도록하려면 어떻게해야합니까?

string dataSourceId = "SomeDataSourceForTesting"; 
    protected override void RenderContents(HtmlTextWriter writer) 
    { 
     IDataSource ds = (IDataSource)Parent.FindControl(dataSourceId); 
     List<string> viewNames = new List<string>(); 
     foreach(string name in ds.GetViewNames()) 
     { 
      viewNames.Add(name); 
     } 
     string viewname = viewNames[0]; 
     writer.WriteLine("the viewname is " + viewname); 
     DataSourceView view = ds.GetView(viewname); 
     view.Select(...); //this really has to be asynchronous? 
     //write out some stuff from the data source 
    } 

답변

1

당신이 데이터 바인딩 된 컨트롤의 유형을 원하는가 :

여기에 내가 쓴 조금입니까? 표 형식을 원하면 System.Web.UI.WebControls.DataBoundControl에서 통제를 파생해야합니다. 계층 적 형식의 경우 System.Web.UI.WebControls.HierarchicalDataBoundControl에서 파생됩니다. 둘 다 DataSource 컨트롤을 할당 할 수있는 속성을 가지고 있습니다.

DataBoundControl의 경우 PerformDataBinding을 대체해야합니다. 이 메서드에는 DataSource에서 제공된 데이터가 들어있는 data이라는 매개 변수가 있습니다.

public class Test : System.Web.UI.WebControls.DataBoundControl 
{ 

    protected override void PerformDataBinding(System.Collections.IEnumerable data) 
    { 
     base.PerformDataBinding(data); 
    } 

} 

HierarchicalDataBoundControl 위해 당신은 DataBoundControl과 같은 이름의 메소드를 오버라이드 (override)합니다. 그리고 GetData 방법을 통해 전망을 얻으십시오.

public class Test : System.Web.UI.WebControls.HierarchicalDataBoundControl 
{ 

    protected override void PerformDataBinding() 
    { 
     base.PerformDataBinding(); 

     System.Web.UI.HierarchicalDataSourceView view = base.GetData("View Path"); 
    } 

} 
+0

완벽합니다. 나는 이런 것을 놓친 것 같았습니다. 감사! – Eric

관련 문제