2010-02-06 4 views
0

나는 gridview 및 링크 단추로 구성된 사용자 정의 컨트롤이 있습니다. 문제는 링크 버튼이 작동하지 않는다는 것입니다. 누군가 제발 좀 봐 주셔서 감사합니다!LinkButton 및 사용자 정의 컨트롤 오류

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     var model = new List<UserControlProof.Model.Customer> { 
      new UserControlProof.Model.Customer { 
       Name = "Customer1", address = "Addr1" }), 
      new UserControlProof.Model.Customer { 
       Name = "Customer2", address = "Addr1" }), 
      new UserControlProof.Model.Customer { 
       Name = "Customer3", address = "Addr2" }), 
      new UserControlProof.Model.Customer { 
       Name = "Customer4", address = "Addr3" }) }; 

     var Addr = (from m in model select m.address).Distinct(); 
     foreach (string addr in Addr) 
     { 
      var cr = (UserControlProof.Controls.CollapseableRecordset)LoadControl(
       "Controls//CollapseableRecordset.ascx"); 
      cr.ID = cr.UniqueID; 
      form1.Controls.Add(cr); 
      cr.DisplayName = Addr; 
      var filterredAddress = from m in model where m.address == addr select m; 
      cr.DataSource = filterredAddress; 
      cr.Count = filterredAddress.Count(); 

      if (cr.Count == 1) 
      { 
       cr.ViewCustomers = true; 
      } 
      cr.DataBind(); 

      form1.Controls.Add(new Literal() { Text = "<br />" }); 
     } 
    } 
} 

public partial class CollapseableRecordset : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      GridView1.Columns.Clear(); 

      BoundField f1 = new BoundField(); 
      f1.DataField = "Customer"; 
      f1.ShowHeader = false; 
      GridView1.Columns.Add(f1); 
     } 
    } 

    //private string displayName; 
    public string DisplayName 
    { 
     get 
     { 
      EnsureChildControls(); 
      return LabelName.Text; 
      //return displayName; 
     } 
     set 
     { 
      EnsureChildControls(); 
      LabelName.Text = value; 
      //displayName = value; 
     } 
    } 

    //private int count; 
    public int Count 
    { 
     get 
     { 
      EnsureChildControls(); 
      return int.Parse(LabelCount.Text); 
      //return count; 
     } 
     set 
     { 
      EnsureChildControls(); 
      LabelCount.Text = value.ToString(); 
      //count = value; 
     } 
    } 

    //private bool ViewCustomers; 
    public bool ViewCustomers 
    { 
     get 
     { 
      EnsureChildControls(); 
      return Link1.Visible; 
     } 
     set 
     { 
      EnsureChildControls(); 
      Link1.Visible = value; 
     } 
    } 

    public object DataSource 
    { 
     get 
     { 
      EnsureChildControls(); 
      return GridView1.DataSource; 
     } 
     set 
     { 
      EnsureChildControls(); 
      GridView1.DataSource = value; 
     } 
    } 


    protected void Link1_Click(object sender, EventArgs e) 
    { 
     Label1.Visible = true; 
    } 
} 

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="CollapseableRecordset.ascx.cs" Inherits="UserControlProof.Controls.CollapseableRecordset" %> 
<%@ Register Assembly="Microsoft.Practices.Web.UI.WebControls" Namespace="Microsoft.Practices.Web.UI.WebControls" 
TagPrefix="pp" %> 
<asp:Label ID="LabelName" runat="server" Text="Name"></asp:Label> 
&nbsp;<asp:Label ID="LabelCount" runat="server" Text="Count"></asp:Label> 
<asp:Panel ID="Panel1" runat="server"> 
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
ShowHeader="False"> 
</asp:GridView> 
<br /> 
<asp:Label ID="Label1" runat="server" Text="Label" Visible="false"></asp:Label> 

</asp:Panel> 
<asp:LinkButton ID="Link1" runat="server" Text="View All"></asp:LinkButton> 

public class Customer 
{ 
    public string Name { get; set; } 
    public string address { get; set; } 
} 
+0

약간의 수정을 부탁드립니다. : S – IAbstract

+0

@skaffman - thx !!! – IAbstract

+0

"작동하지 않겠습니까?"라는 의미를 지정할 수 있습니까? – Jacob

답변

1

LinkButton에 이벤트 처리기를 설정하지 않았습니다. 귀하의 버튼 마크 업 더 다음과 같아야합니다

<asp:LinkButton ID="Link1" runat="server" Text="View All" OnClick="Link1_Click"/> 

응답 추적하는 질문 :

동적으로 추가 된 이벤트 처리기는 ASP.NET 페이지 수명주기를 "생존"하지 않습니다를. 이 라이프 사이클에 익숙해지면 웹 양식 프로그래밍을 이해하는 데 많은 도움이됩니다. 좋은 개요는 this document을 참조하십시오.

선언되지 않은 경우 이벤트 처리기가 작동을 멈추게하는 이유는 ASP.NET에서 생성 된 HTML 페이지에 서버 측 바인딩에 대한 정보가 포함되어 있지 않기 때문입니다. 그것은 모두 포스트 백 동안 설정됩니다. ASP.NET은 게시 된 양식을보고 게시 데이터의 항목을 검사 한 다음 서버 측 개체를 채우고 페이지 정의를 기반으로 이벤트 처리기를 호출합니다. 페이지 정의에 LinkButton이 없으므로 이벤트 처리기를 호출 할 수 없습니다.

간단히 말해서 ASP.NET 웹 양식은 통합 된 상태 저장 클라이언트 - 서버 형식의 환상을 설정하려고 시도하지만 일반적인 패턴 외의 작업을 할 때 쉽게 손상됩니다. 이러한 한계를 극복 할 수는 있지만, 컨트롤을 마크 업하기 만하면 쉽게 작업 할 수 있습니다.

다음은 링크 버튼 문제를 해결할 수있는 방법입니다. 설문지의 Load 이벤트에서 Request.Form 컬렉션의 데이터를보고 lnkShowAllCust이 내 게시판의 원인인지 확인합니다. 그렇다면 클릭을 처리하기위한 메소드를 호출하십시오. 이것은 웹 양식 프레임 워크가 당신을 위해 무엇을 본질적으로 :

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack) 
    { 
     string eventSource = Request.Form["__EVENTTARGET"]; 
     if (eventSource != null && eventSource.EndsWith("lnkShowAllCust")) 
     { 
      Link1_Click(null, EventArgs.Empty); 
     } 
    } 
} 
0

는 어디 LinkButton에 대한 Click 이벤트 핸들러입니다. 나는 가정하고있어

protected void Link1_Click(object sender, EventArgs e) 
    { 
     Label1.Visible = true; 
    } 

방법은 링크 1을 클릭했을 때 실행하도록되어 있지만, 난 당신이 이벤트를 바인딩 표시되지 않습니다를 참조하십시오.

0

지금까지 내가 당신의 CollapseableRecordset 이해 당신이 boundfield를 작성하고 고객 데이터 필드

f1.DataField = "Customer"; 

에 매핑하지만 당신은 당신의 통제에 (그것의 gridview에) 고객 목록을 결합 그래서있는 DataItem은 "고객"하지만, 당신이 결합 속성은 고객 이름의 목록을 얻을 것이다

f1.DataField = "Name"; 

"이름"과 "주소"를 사용하는 경우, 예를 들어 "이름"필드 또는

있습니다

0

내가 하 컨트롤에 대한 click 이벤트에 추가되었습니다. 그렇습니다. 그러나 개념 증명에 동적으로 컨트롤을 추가했는데이 컨트롤은 작동하지 않으며 마크 업에서 링크 버튼을 클릭 이벤트에 추가했습니다.당신은 당신이를 Page_Load 전에 이벤트에 동적 컨트롤을 만들 필요가 있다고 볼 수 페이지에서 이벤트에 대해 제공된 링크를 읽으면

public partial class ucCustomerDetails : System.Web.UI.UserControl 
{ 
    protected override void CreateChildControls() 
    { 
     base.CreateChildControls(); 

     this.lnkShowAllCust.ID = "lnkShowAllCust"; 
     this.lnkShowAllCust.Click += new EventHandler(this.lnkShowAllCust_Click); 
     this.Controls.Add(lnkShowAllCust); 
    } 

    protected override void OnInit (EventArgs e) 
    { 
     CreateChildControls(); 
     base.OnInit(e); 
    } 

    protected override void OnLoad(EventArgs e) 
    { 
     base.EnsureChildControls(); 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (IsPostBack) 
     { 
      CreateChildControls(); 
     } 
    } 

    protected void lnkShowAllCust_Click(object sender, EventArgs e) 
    { 
     this.OnCustShowAllClicked(new EventArgs ()); 
    } 

    protected virtual void OnCustShowAllClicked(EventArgs args) 
    { 
     if (this.ViewAllClicked != null) 
     { 
      this.ViewAllClicked(this, args); 
     } 
    } 

    public event EventHandler ViewAllClicked; 
} 
+0

앞으로는 게시 할 때 코드 형식을 지정하십시오. 구문 하이 라이터는 코드가 4 개 이상의 공백으로 들여 쓰기 된 경우에만 작동합니다. 또한 코드를 들여 쓰기해야합니다. 또한 답변을 게시하지 말고 후속 질문을 위해 질문을 편집해야합니다 (평판 수준에서 질문 편집을 허용하지 않는 경우 사과합니다) – Jacob

+0

추가 질문에 대한 후속 조치를 참조하십시오. – Jacob

0

:

여기 내 코드입니다. Page_Init은 이에 대한 권장 이벤트입니다.

관련 문제