2010-02-06 37 views
0

我有一個用戶控件,它由一個gridview和鏈接按鈕組成。問題是,鏈接按鈕不起作用!請有人看看,並告訴我爲什麼和如何解決它請!LinkBut​​ton和用戶控制錯誤

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 2010-02-06 20:12:34

+0

@skaffman - thx !!! – IAbstract 2010-02-06 20:17:57

+0

你能說明你的意思嗎?「不起作用?」 – Jacob 2010-02-06 20:45:38

回答

1

您缺少在您的LinkButton中設置事件處理程序。你的按鈕標記應該看起來更像是這樣的:

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

應對後續問題

動態添加事件處理程序沒有「生存」的ASP.NET頁面生命週期。熟悉這個生命週期將有助於你理解Web表單編程。請參閱this document以獲得良好的概述。

未聲明時事件處理程序停止工作的原因是由ASP.NET生成的HTML頁面不包含有關服務器端綁定的任何信息;這些都是在後期制定的。 ASP.NET會查看發佈的表單,檢查發佈數據中的項目,然後填充服務器端對象並根據頁面定義調用事件處理程序。由於您的頁面定義不包含LinkButton,因此無法知道調用您的事件處理程序。

簡而言之,ASP.NET Web表單試圖設置統一的,有狀態的客戶端到服務器表單的錯覺,但是當嘗試在常規模式之外進行操作時,錯覺很容易破碎。你可以解決這些限制,但是如果你只是在標記中聲明你的控件,你會讓自己變得更容易。

下面介紹如何解決鏈接按鈕問題。在您的表單的Load事件中,查看Request.Form集合中的數據,看看lnkShowAllCust是您回發的原因。如果是,請致電您的方法來處理點擊。這在本質上是Web窗體框架做什麼你:

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

哪裏是爲LinkButtonClick事件處理程序。我看應該是它我假設

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

方法是點擊鏈接1時要執行的,但我不看你怎麼綁定的事件。

0

至於我在你CollapseableRecordset瞭解您創建一個BoundField,並將其映射到客戶數據字段

f1.DataField = "Customer"; 

,但你的客戶名單(它的GridView控件)綁定到你的控制,因此DataItem的是「客戶」,但綁定到屬性「名稱」和「地址」,如果你使用例如「名稱」字段或

f1.DataField = "Name"; 

你會得到客戶的名單

0

我公頃已經添加到控件的點擊事件,是的這個工程。然而,在我的概念驗證中,我動態地添加了一個控件,並且這個控件不起作用,並且在標記中我添加了帶有單擊事件的鏈接按鈕。

這裏是我的代碼:

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

將來,請在發佈時對代碼進行格式化。只有當代碼縮進四個或更多空格時,語法突出顯示器纔有效。此外,你應該縮進你的代碼。另外,您應該編輯您的問題以解決後續問題,而不是發佈答案(如果您的聲望級別不允許編輯您的問題,我表示歉意) – Jacob 2010-02-06 22:24:22

+0

請參閱我對後續問題的跟進。 – Jacob 2010-02-06 22:35:25

0

如果你閱讀提供的有關頁面事件,你會看到,你需要在Page_Load中前一個事件來創建動態控件的鏈接。 Page_Init是這方面的推薦活動。