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인지 이해하는 것도 좋습니다. 감사!
감사합니다. 그러나 문제의 컨트롤이 Repeater 컨트롤에서 많은 컨트롤 중 하나가 될 것이므로 단일 ViewState 속성을 갖는 것이 어떻게 도움이되는지 이해할 수 없습니다. 예, ViewState에서 좀 더 복잡한 방식으로 데이터를 채울 수는 있지만이 예제의 포스트 백에서 지속되는 것에 대해서도 관심이 없습니다. 단순히 데이터 바인딩시에 성공적으로 포함 된 속성 만 있으면됩니다. – chris4600
죄송합니다. "많은 것 중 하나"란 무슨 뜻인지 이해할 수 없습니다. 리피터에서 사용자 컨트롤의 각 인스턴스는 다른 ViewState를 사용합니다. – afzalulh
고마워, 너 말이 맞아, 뭔가 잘못 해석했다. 나는이 접근법과 같은 것을 사용하게 될지도 모른다. – chris4600