您好,我的问题是我似乎无法从当前页面找到控件。我的页面类包含以下代码:
<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个以上。
简而言之,我如何从另一个控件中调用同一页面中的控件?
答案 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方法应该找到您要查找的控件。您可以与我们分享更多代码来证明问题吗?