0

asp : Repeater에 바인딩 된 동적으로 생성 된 UserControl에 속성을 직접 할당하는 가장 좋은 방법을 알고 싶습니다. 다음 코드를 고려하십시오. 페이지 코드에서asp : Repeater에 바인딩 된 UserControl 데이터에 속성 할당 :

public bool IsRetained = false; 

: 페이지의 코드 숨김에서

<%@Register TagPrefix="pre" TagName="MyControlType" Src="~/MyPath/MyControl.ascx" %> 

<asp:Repeater ID="repeater" DataSource='<%#dataSource%>' runat="server"> 
    <ItemTemplate> 
     <pre:MyControlType runat="server" /> 
    </ItemTemplate> 
</asp:Repeater> 
<asp:Button OnClick="someButton_Click" Text="Add First Item" runat="server" /> 

: 해당 UserControl "MyControlType"에 대한 코드 숨김에서

protected List<MyControlType> dataSource = new List<MyControlType>(); 

protected void someButton_Click(object sender, EventArgs e) 
{ 
    MyControlType myItem = (MyItem)Page.LoadControl("~/MyMath/MyControlType.ascx"); 
    dataSource.Add(myItem); 
    myItem.IsRetained = true; 
    repeater.DataBind(); 

    // test code 
    MyControlType realItem = repeater.Items[0].Controls[1] as MyControlType; 
    bool test0 = realItem.IsRetained; // false 
    bool test1 = myItem == realItem; // false 
} 

새로운 MyControlType 성공적이다 Repeater에 바인딩되어 페이지에 표시되지만 설정 한 IsRetained 값은 없습니다. 또한 dataSource에 할당 한 것과 동일한 MyControlType 인스턴스가 아닙니다.

위의 예에서 realItem을 사용한 방식과 비슷하게 생성 된 MyControlType에 대한 참조를 얻음으로써 원하는 결과를 얻을 수 있지만 myItem을 통해 직접 속성을 할당하는 것이 좋습니다. 누구든지 그렇게하는 방법을 제공 할 수 있습니까? test0 및/또는 test1이 왜 false인지 이해하는 것도 좋습니다. 감사!

답변

0

편집 : 당신의 접근 방식과 몇 가지 문제가 있습니다

:

  1. 당신은 List<MyControlType>를 생성하고 데이터 소스로 사용하려고합니다.

  2. myItem을 초기화하고 목록에 추가하고 데이터 바인딩 후 을 사용하면 Repeater에서 UserControl을 찾을 수 있습니다.

  3. 당신은 마크 업 중계기에 해당 UserControl을 추가하고 데이터 바인딩 후에 당신은 당신이 myItem에 할당 한 값을가집니다 것으로 기대 리피터의 항목 리피터 및 을 찾아 내고있다.

해결 방법 : 를 사용하여 더 나은 데이터 소스 테스트하기 위해, 예를 들어, List<string>.

<asp:Repeater ID="repeater" runat="server"> 
    <ItemTemplate> 
     <pre:MyControlType IsRetained='<%#Container.DataItem == "item 1" ? true : false %>' runat="server" /> 
    </ItemTemplate> 
</asp:Repeater> 

을 그리고 내 코드에서 나는 다음과 같이 테스트입니다 : 다음은 리피터 (테스트 데이터에 repescet에서) 볼 수있는 방법은

protected void someButton_Click(object sender, EventArgs e) 
{ 
    var lst = new List<string>() { "item 1", "item 2", "item 3" }; 
    repeater.DataSource = lst; 
    repeater.DataBind(); 

    // test code 
    MyControlType realItem1 = repeater.Items[0].Controls[1] as MyControlType; 
    MyControlType realItem2 = repeater.Items[1].Controls[1] as MyControlType; 
    MyControlType realItem3 = repeater.Items[2].Controls[1] as MyControlType; 
    bool test1 = realItem1.IsRetained; // true (data == "item 1") 
    bool test2 = realItem2.IsRetained; // false (data != "item 1") 
    bool test3 = realItem3.IsRetained; // false (data != "item 1") 
} 

당신은 우리가 여기에 결과를 예상했다 볼 수 있습니다.

+0

감사합니다. 그러나 문제의 컨트롤이 Repeater 컨트롤에서 많은 컨트롤 중 하나가 될 것이므로 단일 ViewState 속성을 갖는 것이 어떻게 도움이되는지 이해할 수 없습니다. 예, ViewState에서 좀 더 복잡한 방식으로 데이터를 채울 수는 있지만이 예제의 포스트 백에서 지속되는 것에 대해서도 관심이 없습니다. 단순히 데이터 바인딩시에 성공적으로 포함 된 속성 만 있으면됩니다. – chris4600

+0

죄송합니다. "많은 것 중 하나"란 무슨 뜻인지 이해할 수 없습니다. 리피터에서 사용자 컨트롤의 각 인스턴스는 다른 ViewState를 사용합니다. – afzalulh

+0

고마워, 너 말이 맞아, 뭔가 잘못 해석했다. 나는이 접근법과 같은 것을 사용하게 될지도 모른다. – chris4600

관련 문제