找到控制从ASCX ASPX

我试图找到一个aspx页面上的标签,从用户控件(ASCX)上说aspx页面。 显然Page.FindControl(“lablel1”)无法正常工作。 我是否需要在客户端ID添加的地方? 谢谢。

--------------解决方案-------------

我想你应该停下来思考一下你的设计。 你的管制不应以往任何时候都需要了解包含它们的页任何东西 - 你需要去找到页面上的控件从另一个控制告诉我,你应该重新考虑这个问题的事实。

我可以告诉你(有什么小我知道你的架构)的最好的事情是,你应该传递一个参考,你希望能找到到你的用户控件。 这样,你的控制并不一定了解自身以外的东西。

当使用FindControl()控件的直接父的上下文之外,您将需要步行控件树找哪个级别的label住在和调用.FindControl()在适当的水平。

这就是说,采取@Andrew野兔的建议,重新审视你的架构决策。 有可能是一个更好的方式来与它方页面的用户控件进行交互。

例如,您可以在暴露你的用户控件一个公共事件和事件处理程序添加到您的消费网页(或基页/母版)。 当创建一个事件,你可以签名什么都你想要的,所以,尽管有这需要得到传递错误文本。

如果你想获得时髦有了它,你可以把你的错误标签与挂钩到事件自定义控件。

示例事件:

Public Event UserErrorOccured(ByVal ErrorText as String)

错误示例:

If Not Page.IsValid Then
RaiseEvent("The page is not valid")
End If

样品处理器:

protected sub UserEventHandler(ByVal ErrorText as String) Handles MyUserControl.UserErrorOccured
errorLabel.Text = ErrorText
End Sub

创建一个接口,如:

public interface IStatusDisplayer
{
Label StatusLabel { get; }
}

实现显示的错误/状态标签页​​面上的接口。 如果你的用户控件需要访问的标签,你可以这样做:

var statusDisplayer = this.Page as IStatusDisplayer;
if (statusDisplayer != null)
{
statusDisplayer.StatusLabel.Text = "Hello World!";
}

这样的事情应该工作,如果层次结构是可以预见的。

Me.Owner.FindControl("controlName")

要么...

Me.Owner.Parent.FindControl("controlName")

要么...

Me.Owner.Parent.Parent.FindControl("controlName")

如果它是不可预测的,那么你就必须写一个递归(昂贵的)函数来查找控制来代替。 小心在这里你的方法,但因为这种类型的算法可以变得缓慢而笨重,如果过度使用的大页面。

下面是在VB中,通过树向后搜索(从子到父),并找到一个控制一个例子:

Protected Function FindControlByID(ByRef childControl As Control, ByVal ID As String) As Control
Dim ctrl As Control = childControl.FindControl(ID)
If Not ctrl Is Nothing Then
Return ctrl
Else
If Not childControl.Parent Is Nothing Then
Return FindControlByID(childControl.Parent, ID)
Else
Return Nothing
End If
End If
End Function

我这样称呼它:

Dim lbl As Label = FindControlByID(Me.Owner, "label1")

从用户的控制范围内

Me.NamingContainer.FindControl("label1")

Control ct = WebUserControl11.FindControl("DropDownList1");

DropDownList dt = (DropDownList)ct;

TextBox1.Text = dt.SelectedValue.ToString();

一对夫妇的其他想法浮现在脑海中。 存在这样可以用来存储值或类似的想法Session对象Page类的“项目”集合。 另一种是在网页上公开公共方法来更新标签。 有可能是AJAX问题,因为我不知道如何回调可以在同一时间更新页面的多个区域的结构,所以这只是一个警告,我不是说我有这个问题。

TheSteve的回答也适用,是如何我已经做到了,当我在过去不得不虽然它可能会非常棘手折腾围绕控制。 我还要第二安德鲁的回答虽然。

这很简单,首先你需要访问母版页的ContentPlaceHolder:

Dim ContentPlaceHolder1 As ContentPlaceHolder = TryCast(Page.Master.FindControl("ContentPlaceHolder1"), ContentPlaceHolder)

然后,使用的ContentPlaceHolder,你现在可以找到aspx页面上的控件的ID:

TryCast(ContentPlaceHolder1.FindControl("LiteralOnParentASPXPage"), Literal).Text = "some text"

这是一个强制的方法,但它的工作原理时,控制在控制教主深埋:

private Control GetTextEditor(ControlCollection controls)
{
foreach (Control ctrl in controls)
{
if (ctrl.ID != null && ctrl.ID == "teMessage")
return ctrl;
if (ctrl.Controls.Count > 0)
{
Control inner = GetTextEditor(ctrl.Controls);
if (inner != null)
return inner;
}
}
return null;
}

分类:asp.net 时间:2015-03-15 人气:0
本文关键词: asp.net,vb.net
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 2.455 (s). 10 q(s)