음, 그렇게 간단한 작업은 아닙니다. 귀하의 경우에는 리피터를 완벽하게 사용자 정의해야하고 컨트롤에 액세스하고 속성을 변경해야하며 버튼이 있어야하며 이벤트 처리기를 할당해야합니다.
내 대답은 약간 길 수도 있지만 ASP.NET Repeater
을 완전히 사용자 정의해야한다고 생각합니다.
단계별 답변을 따르십시오. 리피터에 바인딩 ID 및 제목 :
가정
우리는 두 개의 열을 가진 테이블을 가지고있다. 우리는 3 개 제어가 중계기 내부
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Repeater ID="rptMyRepeater" ClientIDMode="AutoID" runat="server" OnItemDataBound="rptMyRepeater_ItemDataBound" OnItemCommand="rptMyRepeater_ItemCommand" DataSourceID="SqlDataSource1">
<ItemTemplate>
<asp:TextBox ID="txtMyTextBox" runat="server"></asp:TextBox>
<asp:Button ID="btnSowID" CommandName="ShowID" runat="server" Text="Show ID" />
<asp:Button ID="btnShowTitle" CommandName="ShowTitle" runat="server" Text="Show Title" />
<br /><br />
</ItemTemplate>
</asp:Repeater>
<asp:Label ID="lblMsg" runat="server" Text=""></asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:postdataConnectionString %>" SelectCommand="SELECT * FROM [Titles]"></asp:SqlDataSource>
: 두 개의 버튼과 하나의 텍스트 상자 및 리피터 외부 라벨 (lblMsg이)가
우리는이 같은 ASPX 페이지가 있습니다.
시나리오 :
- 우리는 텍스트 상자에 제목을 표시합니다.
- 홀수 ID 용 단추 표시 및 짝수 ID 용 숨기기 단추.
각 버튼을 클릭하면 관련 행의 ID 또는 제목을 표시합니다.
이 시나리오는 다른 모든 시나리오를 다루고 있으며 코드를 수정하여 다른 작업을 수행 할 수 있다고 생각합니다.
연습 : 첫 번째 목표에 도달하기
1.In 위해 우리가 ItemDataBound
이벤트 처리기 사용 : 위에서
protected void rptMyRepeater_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
System.Data.DataRowView dataItem = e.Item.DataItem as System.Data.DataRowView;
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
TextBox txtMyTextBox = e.Item.FindControl("txtMyTextBox") as TextBox;
txtMyTextBox.Text = dataItem.Row["Title"].ToString();
}
}
우리는 리피터의 텍스트 상자를 찾을 수 데이터베이스에서 Title Column을 지정하십시오.
아웃풋 :
Button btnSowID = e.Item.FindControl("btnSowID") as Button;
Button btnShowTitle = e.Item.FindControl("btnShowTitle") as Button;
if (Convert.ToInt32(dataItem.Row["ID"]) % 2 == 0)
{
btnSowID.Visible = false;
btnShowTitle.Visible = false;
}
을 상기에서 :
2.Now는 우리가 너무이 부분을 추가 홀수 ID에 대한 버튼을 표시 심지어 ID에 대해 그들을 숨기려면 우리는 Repeater에서 btnSowID와 btnShowTitle을 찾고이 행의 ID가 심지어 관련 버튼의 가시성을 false로 설정했는지 확인합니다. 다른 조건을 구현할 수 있다는 것은 명백합니다. 현재 사용자가 관리자 인 경우 버튼을 표시합니다.
아웃풋 : 우리가 추가 할
3.Now가 Repater의 각 버튼에 대한 핸들러를 클릭합니다. 우리가 설정 한 ASPX 코드에서 알 수 있듯이 CommandName
버튼 속성은 앞으로이 속성을 사용합니다.
최종 목표는 각 버튼을 클릭하는 것입니다. lblMsg
은 관련 버튼이 클릭 한 동일한 행의 ID 또는 제목을 표시합니다. 그래서 우리는 클릭 된 버튼의 행을 인식해야합니다.
관련 ID 또는 제목 값을 CommandArgument
에 할당하려면 ItemDataBound
핸들러 아래에있는 각 버튼의 속성을 지정하십시오.
그래서 최종 ItemDataBound
은 다음과 같이해야합니다 : 리피터 내부가 버튼의 클릭 이벤트를 잡기 위해
protected void rptMyRepeater_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
System.Data.DataRowView dataItem = e.Item.DataItem as System.Data.DataRowView;
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
TextBox txtMyTextBox = e.Item.FindControl("txtMyTextBox") as TextBox;
txtMyTextBox.Text = dataItem.Row["Title"].ToString();
Button btnSowID = e.Item.FindControl("btnSowID") as Button;
btnSowID.CommandArgument = dataItem.Row["ID"].ToString();
Button btnShowTitle = e.Item.FindControl("btnShowTitle") as Button;
btnShowTitle.CommandArgument = dataItem.Row["Title"].ToString();
if (Convert.ToInt32(dataItem.Row["ID"]) % 2 == 0)
{
btnSowID.Visible = false;
btnShowTitle.Visible = false;
}
}
}
우리가 ItemCommand
처리기를 사용합니다. 이 핸들러는 Repeater 내부의 컨트롤 이벤트를 잡아서 처리하는 데 도움이됩니다. 그래서 우리는이 같은 ItemCommand
처리기를 정의
protected void rptMyRepeater_ItemCommand(object source, RepeaterCommandEventArgs e)
{
switch (e.CommandName)
{
case "ShowID":
lblMsg.Text = e.CommandArgument.ToString();
break;
case "ShowTitle":
lblMsg.Text = e.CommandArgument.ToString();
break;
}
}
위에서 우리는 ASPX 코드에서 수동으로 설정 한 CommandName
속성을 확인하고 클릭 ShowID 버튼 또는 ShowTitle 버튼입니다 결정합니다. 첫 번째 단계에서 Button을 찾을 수 있는지 확인하십시오. 따라서 우리는 ItemDataBound
처리기 아래에서 동적으로 설정된 CommandArgument
속성을 읽습니다.
은 또한 당신이 btnEdit 및 btnRemove처럼 버튼을 만들려면이 방법을 사용할 수 있습니다, 편집으로 CommandName
의 설정 및 제거하고 행 ID로 CommandArgument
을 설정하고 업데이트를 수행하거나 ItemCommand
처리기에서 데이터베이스에서 삭제합니다.
아웃풋 :
자세한 답변을 가져 주셔서 감사합니다. 내가이 접근법을 알고 대체물을 찾고있을 때 내 지식은 실제로 필요하지 않았습니다. 그러나 나는 그것이 다른 사람들에게 도움이 될 것이라고 강력히 믿습니다. – Budda
@Budda : 어쩌면 aspx 페이지에서 인라인 코드 솔루션을 찾고 있다고 느꼈을 것입니다. (분명히 언급하지 않았다고 생각합니다.) 미래에는 인라인 솔루션으로 이벤트 처리에 문제가 발생할 것이라고 생각합니다. 아마도 시나리오의 변경에서도 코드보기가 더러 우며 두 경우에는'ItemCommand' 핸들러를 사용해야한다고 생각합니다. 그래서 나는 CodeBehind 솔루션이 더 깔끔하고 유연하다고 생각한다. 죄송합니다.이 답변이 정확히 원하는 것이 아니 었으면. – Moshtaf
그래, 몇 가지 유형의 인라인 솔루션을 찾고있었습니다. 그러나 가능한 경우라도 그것은 읽을 수없고 유지할 수없는 것처럼 보입니다. 그러니 아이디어를 가져 주셔서 감사합니다. 이미 구현 된 :) – Budda