在当前页面中找到一个控件
您好,我的问题是我似乎无法从当前页面找到控件。 我的页面类有以下代码:
我的控制有:
Telerik:RadListBox runat="server" CssClass="RadListBox" ID="listbox_action_member" Width="125" Height="200px" Skin="Telerik" OnTransferring="ActionListBoxViewer_Transferring" OnDeleting="ActionListBoxViewer_Deleting" > </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个以上。
简而言之,如何从其他控件中调用同一页面中的控件?
如果控件嵌套在其他控件中,则需要递归地找到它。
这是一个帮助方法。 它以递归方式搜索控件。
助手方法
public static Control FindControlRecursive(Control root, string id) { if (root.ID == id) return root; return root.Controls.Cast() .Select(c => FindControlRecursive(c, id)) .FirstOrDefault(c => c != null); }
用法
var myControl = (MyControl)FindControlRecursive(Page, "ViewMeetingActions");
首先,递归循环遍历页面上的控件。 使用以下帮助程序类:
using System.Web.UI; public class ReflectionHelper { /// /// Check Control for match on ID and recursively check all Children for match on ID. /// /// /// /// Control if found, null if not found /// /// Jason Williams | 9/7/2014 | webprogrammerguy.com 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; } /// /// Check Control for match on ID and recursively check all Children for match on ID. Attempt to Invoke() Control method. /// /// /// /// /// /// bool true if executed, bool false if error or not executed /// /// Jason Williams | 9/7/2014 | webprogrammerguy.com 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; } /// /// Check Control for match on ID and recursively check all Children for match on ID. Attempt to set SetValue() on Control property. /// /// /// /// /// /// bool true if executed, bool false if error or not executed /// /// Jason Williams | 9/7/2014 | webprogrammerguy.com 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; } /// /// Check Control for match on ID and recursively check all Children for match on ID. Attempt to set SetValue() on Control property. /// /// /// /// /// /// bool true if executed, bool false if error or not executed /// Jason Williams | 9/7/2014 | webprogrammerguy.com 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 -->");
谢谢,
Page.Controls为您提供控件层次结构中最顶层控件的集合。 WebForm本身就是一个控件,并包含许多其他控件。 您将需要遍历此层次结构以查看整个控件集合。
FindControl方法应该找到您要查找的控件。 您可以与我们分享更多代码来certificate问题吗?