2013-07-03 2 views
2

FindControl 함수를 사용하여 페이지에서 컨트롤을 찾습니다. 그것은 슈퍼 간단하고 똑바로 MSDN에 보인다지만 컨트롤을 찾을 수 없습니다. 내가 사용하고있는 페이지는 aspx 파일에 contorl을 부여하는 id보다 더 많은 Preaments 인 MasterPageFile을 가지고 있습니다. 작동하지 않는 간단한 예 :vb.net을 사용하여 페이지에서 컨트롤 찾기

aspx 페이지

<%@ Page Title="Inventory Control Test" Language="VB" AutoEventWireup="false"  MasterPageFile="~/Site.master" CodeFile="Default2.aspx.vb"  Inherits="Sales_ajaxTest_Default2" %> 

<asp:Content ID="conHead" ContentPlaceHolderID="head" Runat="Server"> 


</asp:Content> 

<asp:Content ID="conBody" ContentPlaceHolderID="MainBody" Runat="Server"> 

    <asp:Button ID="saveAllBtn" runat="server" Text="Save All" /> 

</asp:Content> 

코드

Partial Class Sales_ajaxTest_Default2 
Inherits System.Web.UI.Page 


Protected Sub saveAllBtn_Click(sender As Object, e As System.EventArgs) Handles saveAllBtn.Click 
    Dim myControl1 As Control = FindControl("ctl00_MainBody_saveAllBtn") 
    If (Not myControl1 Is Nothing) Then 

     MsgBox("Control ID is : " & myControl1.ID) 
    Else 
     'Response.Write("Control not found.....") 
     MsgBox("Control not found.....") 
    End If 
End Sub 

뒤 최종 등급

는 그 MSGBOX가 난 웹 일이 아니다 얻을 이 예제에서는 그냥 사용하고 있습니다. "FindAllBtn"컨트롤에 주어진 ID를 사용하면 FindControl에서 "컨트롤을 찾을 수 없습니다."라는 메시지가 나타납니다. 이것을 시도해도 masterpage가없는 독립형 페이지에서 제대로 작동합니다. 내가 크롬을 사용하여 요소를 검사하는 경우

나는 버튼의 ID 내가의 FindControl에 아직도 얻을 사용하는 경우 "ctl00_MainBody_saveAllBtn은"하지만

+0

[this] (http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx) 읽기가 도움이 될 수 있습니다 .. C#에서 수행됩니다. – BrOSs

답변

7

FindControl을 사용하면 컨트롤의 최종 렌더링 된 "클라이언트 ID"가 아닌 컨트롤의 "서버 ID"(사용자가 지정한 이름)를 지정합니다. 예 : 당신은 saveAllBtn.Click 이벤트에 있기 때문에 (당신은 당신이에있는 이벤트를 트리거하기 위해 그 버튼을 클릭 때문에)

Dim myControl as Control = MainBody.FindControl("saveAllBtn") 

그러나, 특정 예에서, 당신이 찾고있는 컨트롤은 실제로 sender 매개 변수입니다 예 : 당신은 단지 하나를 선호한다 saveAllBtn 제어, wweicker의 두 번째 방법 using CType(sender, Button)를 찾으려면

Dim myControl as Button = CType(sender, Button) 
+2

네가 보낸 사람에 대해 옳다. 가난한 예를 사용하는 것에 대한 내 잘못이다. 나는 페이지에 다른 컨트롤을 놓아야하고, 내가 실제로하려고하는 것과 더 많은 인라인을 가졌을 ID로 그것을 얻으려고했다. MainBody.FindControl을 사용하면 Visual Studio에서 MainBody가 선언되지 않는다고 말합니다. 하지만 난 runat 서버와 div에 필요한 컨트롤을 래핑하고 동일한 아이디어를 사용하여 액세스 할 수 있습니다. divID.findcontrol가 작동합니다. 고맙습니다. – Kevin

1

의 FindControl가 작동하지 않습니다 "컨트롤을 찾을 수 없습니다"로 변경되었음을 발견 재귀 적으로. 한 지점에서 시작해야합니다 (예를 들어,), 그리고 그것이 당신이 찾고있는 컨트롤이 아닌 경우 시작 지점의 Controls 컬렉션을 검색하십시오. 기타 등등.

4

.

그러나 다른 컨트롤을 이름으로 찾으려면 FindControl을 사용할 수 없습니다. 다른 컨트롤 안에 중첩되어 있기 때문에 컨트롤을 재귀 적으로 찾아야합니다. 여기

헬퍼 방법 -

Protected Sub saveAllBtn_Click(sender As Object, e As EventArgs) 
    Dim button = TryCast(FindControlRecursive(Me.Page, "saveAllBtn"), Button) 
End Sub 

Public Shared Function FindControlRecursive(root As Control, id As String) As Control 
    If root.ID = id Then 
     Return root 
    End If 

    Return root.Controls.Cast(Of Control)().[Select](Function(c) FindControlRecursive(c, id)).FirstOrDefault(Function(c) c IsNot Nothing) 
End Function 

참고 : 나는 C#으로 쓴 converter를 사용하여 VB로 변환하기 때문에 내 VB 코드, 이상한 물린 수 있습니다.

+0

재귀 함수는 항상 재미 있습니다. findcontrol (IdName)을 사용할 수 없다는 것을 지적 해 주셔서 감사합니다. – Kevin

관련 문제