2012-02-03 2 views
1

ListBox 컨트롤에 대해 DataBoundControlAdapter를 만들려고하고 있는데 어떤 이유로 DataBoundControlAdapter에서 PerformDataBinding 메서드가 실행되지 않습니다. MSDN Documentation 따르면 ListBox에 대해 DataBoundControlAdapter에서 PerformDataBinding이 실행되지 않음

:

DataBoundControlAdapter 제어 어댑터가 DataBoundControl 클래스에서 파생되는 제어 에 부착 될 때 PerformDataBinding 방법은 DataBoundControl.PerformDataBinding 방법 대신에 호출

.

어떤 아이디어가 전혀 발생하지 않았습니까?

기본적으로 작동 방식은 다음과 같습니다.

는 BrowserFile :

<browsers> 
    <browser refID="Default"> 
    <controlAdapters> 
     <adapter 
      controlType="System.Web.UI.WebControls.ListBox" 
      adapterType="SomeNameSpace.ListBoxDataAdapter" /> 
    </controlAdapters> 
    </browser> 
</browsers> 

어댑터 : 페이지

namespace SomeNameSpace 
{ 
    public class ListBoxDataAdapter : DataBoundControlAdapter 
    { 
     protected override void PerformDataBinding(System.Collections.IEnumerable data) 
     { 
      base.PerformDataBinding(data); // Not firing 
     } 
    } 
} 

는 :

<asp:ListBox runat="server" ID="lbxStuff" DataSourceID="obsStuff" DataValueField="Value" 
    DataTextField="Text></asp:ListBox> 
<asp:ObjectDataSource runat="server" ID="obsStuff" TypeName="Test" SelectMethod="Get"> 
</asp:ObjectDataSource> 
+1

내가 도움을 줄 수있는 누군가의 코드를 게시해야한다고 생각합니다. –

+0

알겠습니다. – Helix

답변

1

DataBoundControl 합니다 (ListControl의 /리스트 박스베이스 클래스) 방법을 포함 PerformSelect라고하는이 메서드는 어댑터에서 데이터를 검색합니다. 덕분에이로 늘 수 - 가 (마이크로 소프트)이 ListControl의 생성이 PerformSelect 방법과 didnt가함으로써 적응력을 제거, 자신의 재정에 어댑터를 포함 오버라이드 누구든지

그러나 (있는 경우 즉) 자연과 같은 자체 PerformDataBinding 메서드를 간단하게 만들 수 있습니다.

하는 것은 당신의 DataBoundControlAdapter에 당신의 ObjectDataSource를 얻을리스트 박스의 데이터 바인딩 방법 첨부 데이터가 "수동"을 PerformDataBinding 메서드를 호출하여 검색 한 후 다른 (다시 호출되는 것을 ObjectDataSource를 취소 할 수 있습니다,하지만 손실되지 않습니다 당신이 무엇을 하든지 오버라이드 될 것입니다.).

다음과 같은 "해킹"과 비슷합니다.

void listBox_DataBinding(object sender, EventArgs e) 
{ 
    ObjectDataSource ods = listBox.DataSourceObject as ObjectDataSource; 
    if (ods != null) 
    { 
     IEnumerable data = ods.Select(); 
     PerformDataBinding(data); 
     ods.Selecting += (s, ev) => { ev.Cancel = true; }; 
    } 
} 
당신은 내가 당신이 정말하고 싶지 않는 무언가 먹으 렴 생각 어댑터를 사용하고 있기 때문에 나는 거의 당신이 "서브 클래스라는"목록 상자에 의해 더 나을 것이다라고하는 경향하지만 것

?