2009-04-09 35 views
6

tôi đã tạo một điều khiển đơn giản người dùng bằng cách sử dụng AJAX Control Toolkit Accordion, LinkButton, và TextBox như thế này:sự kiện lệnh LinkButton dường như không được bắn

TestControl.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="TestControl.ascx.cs" Inherits="TestControl" %> 
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %> 
<cc1:Accordion ID="Accordion1" runat="server"> 
    <Panes></Panes> 
    <HeaderTemplate> 
     <div><%# Container.DataItem %></div> 
    </HeaderTemplate> 
    <ContentTemplate> 
     <div> 
      <asp:TextBox ID="textBox" Text='<%# Container.DataItem %>' runat="server"></asp:TextBox> 
      <asp:LinkButton Text="Update" CommandName="Update" CommandArgument='<%# Container.DataItem %>' OnCommand="LinkButton_Command" runat="server"></asp:LinkButton> 
     </div> 
    </ContentTemplate> 
</cc1:Accordion> 

Và TestControl.ascx .cx:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class TestControl : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     Accordion1.DataSource = new string[] { "one", "two", "three" }; 
     Accordion1.DataBind(); 
    } 

    protected void LinkButton_Command(object sender, CommandEventArgs e) 
    { 
     if (e.CommandName == "Update") 
     { 
      TextBox value = ((LinkButton)sender).Parent.FindControl("textBox") as TextBox; 
      ((string[])Accordion1.DataSource)[Accordion1.SelectedIndex] = value.Text; 
      Accordion1.DataBind(); 
     } 
    } 
} 

Trình xử lý sự kiện LinkButton_Command không kích hoạt trên nhấp chuột đầu tiên, nhưng trên thứ hai. Có vấn đề gì với vòng đời mà các điều khiển đang được tạo ra khiến các sự kiện không được nối đúng cách?

Cập nhật: tôi thêm sự kiểm soát tĩnh:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 

<%@ Register src="TestControl.ascx" tagname="TestControl" tagprefix="uc2" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title> 
</head> 
<body> 

    <form id="form1" runat="server">  
    <asp:ScriptManager ID="ScriptManager1" runat="server"> 
    </asp:ScriptManager> 
    <div border="1"> 
     <uc2:TestControl ID="TestControl1" runat="server" /> 
    </div> 



    </form> 
</body> 
</html> 
+0

Bạn có thêm điều khiển người dùng của mình vào trang động không? – womp

+0

Tôi không nghĩ vậy - đây chỉ là một điều khiển người dùng web trong một dự án trang web, và tôi đang chạy nó dưới trình gỡ rối, và tôi bỏ điều khiển trực tiếp trên một trang. –

+0

Hãy nghi ngờ điều này, nhưng bạn có cần một ID trên nút liên kết không? – madcolor

Trả lời

3

Dưới đây là một giải pháp. Tôi đã kiểm tra này ra trong một dự án thử nghiệm, và các công trình này:

ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TestControl.ascx.cs" Inherits="WebApplication1.TestControl" %> 
<%@ Import Namespace="System.ComponentModel"%> 
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="cc1" %> 

<cc1:Accordion ID="Accordion1" runat="server" Enabled="True"> 

    <Panes></Panes> 
    <HeaderTemplate> 
     <div><asp:Label runat="server" ID="HeaderLabel"><%# Container.DataItem %></asp:Label></div> 
    </HeaderTemplate> 
    <ContentTemplate> 
     <div> 
      <asp:TextBox ID="textBox" Text='<%# Container.DataItem %>' runat="server"></asp:TextBox> 
      <asp:LinkButton ID="LinkButton1" Text="Update" CommandName="Update" CommandArgument='<%# Container.DataItem %>' 
      OnCommand="LinkButton_Command" runat="server"></asp:LinkButton> 
     </div> 
    </ContentTemplate> 

</cc1:Accordion> 

codebehind:

public partial class TestControl : System.Web.UI.UserControl 
{ 
    protected void Page_Init(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      Accordion1.DataSource = new string[] {"one", "two", "three"}; 
      Accordion1.DataBind(); 
     } 
    } 

    protected void LinkButton_Command(object sender, CommandEventArgs e) 
    { 
     if (e.CommandName == "Update") 
     { 
      TextBox value = ((LinkButton)sender).Parent.FindControl("textBox") as TextBox; 
      (Accordion1.Panes[Accordion1.SelectedIndex].Controls[0].Controls[1] as Label).Text = value.Text; 
     } 
    } 
} 

Dường như databinding các Accordion có một số vấn đề mà lộn xộn lên xử lý sự kiện của bạn nhận được kết nối. Re-ràng buộc nó mỗi lần nukes họ bằng cách nào đó.

Ngoài ra, mã đã đăng của bạn có một DataBind() được gọi trong phương thức LinkButton_Command, hiện đang xảy ra sau khi đã tải xong chế độ xem. Điều này sẽ dẫn đến các dữ liệu cập nhật không được hiển thị cho đến khi postback tiếp theo, bởi vì các bindings mới sẽ không được lưu trong ViewState. Nó sẽ hành động như nó luôn luôn là một postback phía sau.

Các vấn đề liên quan