Bir Tekrarlayıcı Öğesi denetiminin bir istemci kimliğini çözüyorum ve onu başka bir komutta kullanmak istiyorum, denetimi kendi istemci kimliği tarafından nasıl alamıyorum?clientID tarafından kontrolü ele al
TextBox TB = FindControl ...?
Bir Tekrarlayıcı Öğesi denetiminin bir istemci kimliğini çözüyorum ve onu başka bir komutta kullanmak istiyorum, denetimi kendi istemci kimliği tarafından nasıl alamıyorum?clientID tarafından kontrolü ele al
TextBox TB = FindControl ...?
Yineleyicinin içinde bulunan metin kutusunu bulmaya çalışıyor musunuz? Eğer öyleyse, kontrolün kimliğine göre arama yapan aşağıdaki yöntemi kullanabilirsiniz - bunun yerine kontrolün clientID'sini kontrol etmek için değiştirebilirsiniz.
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 %>
Belirli RepeaterItem öğesine (ItemDataBound olay işleyicisinde yaptığınız gibi) erişiminiz var mı?
Eğer öyleyse, çocuk kontrolünü almak için repeaterItem.FindControl("YourControlId")
yapabilirsiniz. Bunun yerine bölmek ve her seferinde bir kontrol yukarı grubundan gidebiliriz tüm denetim ağacında tüm denetimleri döngü
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();
}
}
Not: Bu fonksiyon ClientIDSeparator onun korunmuş bir özelliğini kullanır Bu, Control
sınıfında tanımlanmış olduğundan, bu yöntemin Control'ü devralan bir şeyde kullanılması gerekir.
en kısa kod buradadır:
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;
}
Çok teşekkürler! Bu bana çok yardımcı oldu. –