1

FindControl 関数を使用して、ページ上のコントロールを探しています。MSDN では非常にシンプルでわかりやすいように見えますが、コントロールを見つけることができません。私が使用しているページには、aspx ファイルで制御を与える ID の先頭に追加する MasterPageFile があります。機能しない簡単な例:

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 は、この例で使用しているだけの Web のものではないことがわかりました。コントロールに与えられた ID である「saveAllBtn」を使用すると、FindControl で「コントロールが見つかりません」と表示されます。これを試してみると、マスターページのないスタンドアロンのページで問題なく動作します。

クロムを使用して要素を調べると、ボタンの ID が「ctl00_MainBody_saveAllBtn」に変更されていることがわかりますが、FindControl でそれを使用すると、「コントロールが見つかりません」というメッセージが表示されます。

4

3 に答える 3

5

コントロールを見つけたいだけならsaveAllBtn、wweicker の 2 番目の方法using CType(sender, Button)が適しています。

ただし、他のコントロールを名前で検索したい場合は、単に使用することはできません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 コードは少し奇妙かもしれません。

于 2013-07-03T17:47:34.643 に答える