我解析了一個Repeater項目控件的客戶端ID,並且我想在其他命令中使用它, 我怎麼不能通過他的客戶端ID獲取控件?通過客戶端ID獲取控制
TextBox TB = FindControl ...?
我解析了一個Repeater項目控件的客戶端ID,並且我想在其他命令中使用它, 我怎麼不能通過他的客戶端ID獲取控件?通過客戶端ID獲取控制
TextBox TB = FindControl ...?
您是否試圖找到駐留在中繼器內的文本框?如果是這樣,您可以使用下面的方法根據控件的ID進行搜索 - 您可以修改它以基於控件的clientID進行檢查。
public static System.Web.UI.Control FindControlIterative(System.Web.UI.Control root, string id)
{
System.Web.UI.Control ctl = root;
var ctls = new LinkedList<System.Web.UI.Control>();
while (ctl != null)
{
if (ctl.ID == id)
return ctl;
foreach (System.Web.UI.Control child in ctl.Controls)
{
if (child.ID == id)
return child;
if (child.HasControls())
ctls.AddLast(child);
}
if (ctls.First != null)
{
ctl = ctls.First.Value;
ctls.Remove(ctl);
}
else return null;
}
return null;
}
<%= Control.ClientID %>
你可以訪問特定的RepeaterItem(就像您在ItemDataBound事件處理程序)?
如果是這樣,你可以做repeaterItem.FindControl("YourControlId")
來獲得子控件。
public static System.Web.UI.Control GetControlIterativeClientID(System.Web.UI.Control root, string id)
{
System.Web.UI.Control ctl = root;
var ctls = new LinkedList<System.Web.UI.Control>();
if (root != null)
{
if (ctl.ID == id)
return ctl;
foreach (System.Web.UI.Control child in ctl.Controls)
{
if (child.ID == id)
return child;
if (child.HasControls())
GetControlIterativeClientID(child, id);
}
}
return null;
}
而是循環的所有控件整個控件樹,你可以把它分解,並從集團轉到上一級控制當時的:
public Control GetControlByClientId(string clientId)
{
Queue<string> clientIds = new Queue<string>(clientId.Split(ClientIDSeparator));
Control root = this.Page;
string subControlId = null;
while (clientIds.Count > 0)
{
if (subControlId == null)
{
subControlId = clientIds.Dequeue();
}
else
{
subControlId += ClientIDSeparator + clientIds.Dequeue();
}
Control subControl = root.FindControl(subControlId);
if (subControl != null)
{
root = subControl;
subControlId = null;
}
}
if (root.ClientID == clientId)
{
return root;
}
else
{
throw new ArgumentOutOfRangeException();
}
}
注:此功能使用ClientIDSeparator其受保護的屬性這是在Control
類中定義的,所以此方法必須用於繼承Control的某些內容。
最短的代碼是在這裏:
private Control getControl(Control root, string pClientID)
{
if (root.ClientID == pClientID)
return root;
foreach (Control c in root.Controls)
using (Control subc= getControl(c, pClientID))
if (subc != null)
return subc;
return null;
}
非常感謝!它對我非常有幫助。 – 2013-11-11 14:11:07