リピーターアイテムコントロールのクライアント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;
}
コントロール ツリー全体ですべてのコントロールをループする代わりに、それを分割して、グループから一度に 1 つのコントロールに移動できます。
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();
}
}
注: この関数は、クラスで定義された保護されたプロパティであるClientIDSeparatorControlを使用するため、このメソッドは Control を継承するもので使用する必要があります。
<%= Control.ClientID %>
特定の RepeaterItem にアクセスできますか (ItemDataBound イベント ハンドラーのように)?
もしそうならrepeaterItem.FindControl("YourControlId")、子コントロールを取得することができます。