2012-03-22 45 views
10

HTMLtìm kiểm soát trong trang

<body> 
    <form id="form1" runat="server">  
     <asp:Button runat="server" ID="a" OnClick="a_Click" Text="apd"/>  
    </form> 
</body> 

protected void a_Click(object sender,EventArgs e) 
{ 
    Response.Write(((Button)FindControl("a")).Text); 

} 

Mã này hoạt động tốt.

Tuy nhiên, mã này:

HTML

<%@ Page Title="" Language="C#" MasterPageFile="~/Student/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Student_Default" %> 


<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"> 
    <asp:Button runat="server" ID="a" OnClick="a_Click" Text="andj"/> 
</asp:Content> 

protected void a_Click(object sender, EventArgs e) 
{ 
    Response.Write(((Button)FindControl("a")).Text); 
} 

Mã này không hoạt động và lợi nhuận FindControlNull - tại sao điều này?

Phương thức FindControl hoạt động trong một trang đơn giản, nhưng trong trang chính, nó có hoạt động không?

ID của a được đổi thành ctl00_ContentPlaceHolder1_a - làm cách nào để kiểm soát?

+2

Các ClientId và id là không giống nhau, và clientidmode sẽ không thay đổi bất cứ điều gì trong ví dụ này – f2lollpll

Trả lời

28

Để tìm nút trên trang nội dung của bạn, trước tiên bạn phải tìm kiếm điều khiển ContentPlaceHolder1. Sau đó sử dụng chức năng FindControl trên ContentPlaceHolder1 kiểm soát để tìm kiếm các nút bấm của bạn:

ContentPlaceHolder cph = (ContentPlaceHolder)this.Master.FindControl("ContentPlaceHolder1"); 
Response.Write(((Button)cph.FindControl("a")).Text); 
+0

Mã này được đặt trong mã phía sau của trang cái hoặc trang bạn đang cố định vị trí các điều khiển. Tôi nghĩ bạn có nghĩa là chủ nhưng chỉ để làm rõ. –

+0

@Chef_Code: Có. Bậc thầy. – Hans

0

Điều này có thể do cách ASP.NET đặt tên các ID khách hàng cho các điều khiển lồng nhau. Nhìn vào nguồn trang và xem chính xác những gì ASP.NET đặt tên cho điều khiển của bạn.

Ví dụ, nhìn vào trang của tôi, tôi có thể thấy rằng các nút trong placeholder nội dung làm cho như thế này:

<input type="submit" name="ctl00$ContentPlaceHolder1$btn1" value="hello" id="MainContent_btn1" /> 

Trong trường hợp này FindControl ("ctl00 $ ContentPlaceHolder1 $ btn1") trả về một tham chiếu đến Nút.

+0

Mở rộng trên bình luận cuối cùng của ông, sử dụng View Source trên trình duyệt web của bạn để xem đầy đủ tên mà ASP.NET tạo ra (nó có thể khá dài). – Guvante

+0

'a' đã thay đổi thành 'ctl00_ContentPlaceHolder1_a' bây giờ làm cách nào để tìm điều khiển? – user1263390

+0

FindControl ("ctl00 $ ContentPlaceHolder1 $ a") – McGarnagle

-3

Xem liệu ID của kiểm soát có đang được hiển thị là 'a' hay không. Sử dụng các công cụ phát triển hoặc firebug khi trang đang tải. Bạn có thể thay đổi chế độ id ứng dụng thành tĩnh và nhận cùng một ID mỗi lần.

+0

'a' đã thay đổi thành 'ctl00_ContentPlaceHolder1_a' bây giờ làm cách nào để tìm điều khiển? – user1263390

+0

Vâng, bạn có thể đặt ctl00_ContentPlaceHolder1_a đó là tên mà nó có thể tìm thấy. Hoặc thay đổi nút thành clientidmode = static và xem id là gì. Nó chỉ nên ở 'a'. – Adam

0

được lồng vào nhau. bạn có trang của bạn, bên trong trang có nhiều điều khiển hơn, một số các điều khiển này chứa chính các điều khiển. phương thức FindControl chỉ tìm kiếm vùng chứa tên hiện tại, hoặc nếu bạn làm Page.FindControls nếu sẽ chỉ tìm kiếm các điều khiển trong Trang, không phải trong các Điều khiển bên trong các điều khiển đó, do đó bạn phải tìm kiếm đệ quy.

nếu bạn biết nút nằm bên trong giữ chỗ nội dung và bạn biết id của nó bạn có thể làm:

ContentPlaceHolder cph = Page.FindControl("ContentPlaceHolder1"); 
Response.Write(((Button)cph.FindControl("a")).Text); 

cách khác, nếu điều khiển của bạn được lồng sâu sắc, bạn có thể tạo một hàm đệ quy để tìm kiếm nó :

private void DisplayButtonText(ControlCollection page) 
{ 
    foreach (Control c in page) 
    { 
     if(((Button)c).ID == "a") 
     { 
     Response.Write(((Button)c).Text); 
     return null; 
     } 
     if(c.HasControls()) 
     { 
     DisplayButtonText(c.Controls); 
     } 
} 

ban đầu bạn sẽ vượt qua Page.Controls này

1

nếu trang để tìm kiếm không có trang chủ

this.Page.Master.FindControl("ContentPlaceHolder1"); 

khác

this.Page.Master.FindControl("ContentPlaceHolder1").FindControl("controlAFromPage"); 
0
ContentPlaceHolder cph = (ContentPlaceHolder)this.Master.Master.FindControl("ContentPlaceHolder1"); 
     Button img = (Button)cph.FindControl("btncreate_email"); 
+0

Vui lòng giải thích mã của bạn. – hgwhittle

0

này nên tìm thấy bất kỳ kiểm sốt trên trang

private Control FindALL(ControlCollection page, string id) 
{ 
    foreach (Control c in page) 
    { 
    if (c.ID == id) 
    { 
     return c; 
    } 

    if (c.HasControls()) 
    { 
     var res = FindALL(c.Controls, id); 

     if (res != null) 
     { 
     return res; 
     } 
    }  
    } 
    return null; 
} 

Gọi như:

Button btn = (Button)FindALL(this.Page.Controls, "a"); 
btn.Text = "whatever"; 
0

Để tìm sự kiểm soát trang chủ trên khác các trang chúng ta có thể sử dụng này:

Button btnphotograph = (Button)this.Master.FindControl("btnphotograph"); 
btnphotograph.Text="Hello!!"; 
Các vấn đề liên quan