在当前页面中找到一个控件

时间:2013-05-15 10:12:02

标签: c# telerik controls

您好,我的问题是我似乎无法从当前页面找到控件。我的页面类包含以下代码:

        <div class="meeting_body_actions"> 
                <efv:ViewMeetingActions ID="ViewMeetingActions" runat="server" />
        </div>

我的控制权有:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ViewMeetingActions.ascx.cs" Inherits="EFV.Controls.ViewMeetingActions" %>
<%@ Register assembly="Telerik.Web.UI" namespace="Telerik.Web.UI" tagprefix="telerik" %>

Telerik:RadListBox runat="server"  CssClass="RadListBox" ID="listbox_action_member" Width="125" Height="200px" Skin="Telerik" OnTransferring="ActionListBoxViewer_Transferring" OnDeleting="ActionListBoxViewer_Deleting" >
         <ButtonSettings AreaHeight="30" Position="Bottom" HorizontalAlign="Center" />  
        <HeaderTemplate>               
        </HeaderTemplate>
        <Items>
        </Items>
      <FooterTemplate>
          <asp:DropDownList runat="server" ID="action_member_dropdown"  Height="22" Width="125"  ></asp:DropDownList>
        </FooterTemplate>
    </telerik:RadListBox

从另一个控件我需要在“action_member_dropdown”中输出信息;

  Control control = this.Page.FindControl("ViewMeetingActions");
  -> doesnt work

        Page page = HttpContext.Current.Handler as Page;
        Control ViewMeetingActions = page.FindControl("ViewMeetingActions");
        -> didnt work as well

Page test = this.Parent.Page;
-> no succes

如果我问页面有多少控件我说它有1个控件,然后我添加了5个以上。

简而言之,我如何从另一个控件中调用同一页面中的控件?

3 个答案:

答案 0 :(得分:1)

如果控件嵌套在其他控件中,则需要递归地找到它。

这是一个帮助方法。它以递归方式搜索控件。

帮助方法

public static Control FindControlRecursive(Control root, string id)
{
   if (root.ID == id) 
     return root;

   return root.Controls.Cast<Control>()
      .Select(c => FindControlRecursive(c, id))
      .FirstOrDefault(c => c != null);
}

用法

var myControl =  (MyControl)FindControlRecursive(Page, "ViewMeetingActions"); 

答案 1 :(得分:1)

首先,递归循环遍历页面上的控件。使用以下帮助程序类:

using System.Web.UI;

public class ReflectionHelper
{

/// <summary>
/// Check Control for match on ID and recursively check all Children for match on ID.
/// </summary>
/// <param name="ParentControl"></param>
/// <param name="ControlId"></param>
/// <returns>Control if found, null if not found</returns>
/// /// <remarks>Jason Williams | 9/7/2014 | webprogrammerguy.com</remarks>
public static Control FindControlRecursive(Control ParentControl, string ControlId)
{
    if (ParentControl.ID == ControlId) {
        return ParentControl;
    }

    foreach (Control Ctl in ParentControl.Controls) {
        Control FoundCtl = FindControlRecursive(Ctl, ControlId);
        if ((FoundCtl != null)) {
            return FoundCtl;
        }
    }
    return null;
}

/// <summary>
/// Check Control for match on ID and recursively check all Children for match on ID.  Attempt to Invoke() Control method.
/// </summary>
/// <param name="ParentControl"></param>
/// <param name="ControlId"></param>
/// <param name="MethodName"></param>
/// <param name="parameters"></param>
/// <returns>bool true if executed, bool false if error or not executed</returns>
/// /// <remarks>Jason Williams | 9/7/2014 | webprogrammerguy.com</remarks>
public static bool FindControlRecursiveAndInvokeMethod(Control ParentControl, string ControlId, string MethodName, object[] parameters)
{
    var ctrl = FindControlRecursive(ParentControl, ControlId);

    if (ctrl != null)
    {
        try
        {
            MethodInfo[] ctrlMethods = ctrl.GetType().GetMethods();
            foreach (MethodInfo method in ctrlMethods)
            {
                if (method.Name == MethodName)
                {
                    method.Invoke(ctrl, parameters);
                    return true;
                }
            }
            //return false;
        }
        catch (System.Exception)
        {
            //return false;
        }
    }
    else
    {
        //return false;
    }

    return false;
}

/// <summary>
/// Check Control for match on ID and recursively check all Children for match on ID.  Attempt to set SetValue() on Control property.
/// </summary>
/// <param name="ParentControl"></param>
/// <param name="ControlId"></param>
/// <param name="PropertyName"></param>
/// <param name="value"></param>
/// <returns>bool true if executed, bool false if error or not executed</returns>
/// /// <remarks>Jason Williams | 9/7/2014 | webprogrammerguy.com</remarks>
public static bool FindControlRecursiveAndSetPropertyValue(Control ParentControl, string ControlId, string PropertyName, string value)
{
    var ctrl = FindControlRecursive(ParentControl, ControlId);

    if (ctrl != null)
    {
        try
        {
            PropertyInfo[] ctrlProperties = ctrl.GetType().GetProperties();
            foreach (PropertyInfo property in ctrlProperties)
            {
                if (property.Name == PropertyName)
                {
                    property.SetValue(ctrl, value, new object[0]);
                    return true;
                }
            }
            //return false;
        }
        catch (System.Exception)
        {
            //return false;
        }
    }
    else
    {
        //return false;
    }

    return false;
}

/// <summary>
/// Check Control for match on ID and recursively check all Children for match on ID.  Attempt to set SetValue() on Control property.
/// </summary>
/// <param name="ParentControl"></param>
/// <param name="ControlId"></param>
/// <param name="PropertyName"></param>
/// <param name="value"></param>
/// <returns>bool true if executed, bool false if error or not executed</returns>
/// <remarks>Jason Williams | 9/7/2014 | webprogrammerguy.com</remarks>
public static bool FindControlRecursiveAndSetPropertyValue(Control ParentControl, string ControlId, string PropertyName, int value)
{
    var ctrl = FindControlRecursive(ParentControl, ControlId);

    if (ctrl != null)
    {
        try
        {
            PropertyInfo[] ctrlProperties = ctrl.GetType().GetProperties();
            foreach (PropertyInfo property in ctrlProperties)
            {
                if (property.Name == PropertyName)
                {
                    property.SetValue(ctrl, value, new object[0]);
                    return true;
                }
            }
            //return false;
        }
        catch (System.Exception)
        {
            //return false;
        }
    }
    else
    {
        //return false;
    }

    return false;
}

}

其次,使用该类获取Control Ref:

Control ctrlActionMemberDropdown = ReflectionHelper.FindControlRecursive(this.Page, "action_member_dropdown");

第三,将行插入DropDownList控件:

ctrlActionMemberDropdown.Items.Insert(0, "<-- Select -->");

谢谢,

答案 2 :(得分:0)

Page.Controls为您提供控件层次结构中最顶层控件的集合。 WebForm本身就是一个控件,并包含许多其他控件。您将需要遍历此层次结构以查看整个控件集合。

FindControl方法应该找到您要查找的控件。您可以与我们分享更多代码来证明问题吗?