C# Mouse Altındaki Control'e Ulaşmak ?
-
Formumda birkaç sayfadan oluşan bir tabcontrol mevcut sayfaların içinde de veri gösterdiğim datagrid,listbox,treeview nesneleri var.
bu nesnelere contextmenustrip eklemek istiyorum fakat hepsine ayrı ayrı contextmenustrip eklemek yerine
örneğin yenileToolStrip in click eventında tıklamanın hangi controlden geldiğini bulup ona göre işlem yapmam gerekiyor yani
void yenileToolStrip_click()
{
if(gelen==grid1)
grid1.temizle();
grid1.doldur();
}
//yada
if(gelen==list1)
{
list1.temizle();
list1.doldur();
}
}
gibi
mouse position'a göre mouseun altındaki controlü bulmaya çalıştım
(http://stackoverflow.com/questions/2411062/how-to-get-control-under-mouse-cursor)
// Console.Writeline(ControlNavigatorHelper.getYoungestChildUnderMouseControl(tabControl).Name);
fakat örnek parametre olarak tabcontrol veriyorum bana tabPage dönüyor grid dönmüyor.
bu olayı en kısa nasıl halledebilirim ?
Teşekkürler :)
-
Yapmak istediğin şeyi tam olarak anlıyamadığımdan kesin bi cevap veremiyorum,
Eğer forum da ki belli nesnelere context menü vermek istiyorsan ve bunu tek tek yapmak istemiyorsan formun loadında yada kurucu methodunda forum controllerini foreach ile çekersin istediğin türdeki nesneleri sorgu ile kontrol edersin uyarsa context menünü ayalarlarsın.
-
Senin bulduğun örnektekiler form eventlerinde kullanınca sadece formun childlarında işe yaradı. GetChildAtPoint methodu form'un childlarının childlarına bakmıyor. O yüzden bende aşağıdaki gibi bir yaklaşımla tüm controllere mouse eventi verdim. Aşağıdaki eventte hangi kontrolün üzerine tıklanırsa o event çalışacağı için controlü console'a yazdırabiliyor. Tabii bu yaklaşım senin tam istediğin olmayabilir. Düşüncelerini bekliyorum.
public Form1()
{
InitializeComponent();
this.MouseClick += new MouseEventHandler(c_MouseClick);
setMouseClickEventToChild(this);
}
private void setMouseClickEventToChild(Control topControl)
{
foreach (Control c in topControl.Controls)
{
c.MouseClick += new MouseEventHandler(c_MouseClick);
if (c.HasChildren)
setMouseClickEventToChild(c);
}
}
public void c_MouseClick(object sender, EventArgs e)
{
if (sender is Control)
{
Console.WriteLine(((Control)sender).Name);
}
}
-
istedigi mause'nin altinda ne var onu bulmak anladigim kadari ile dogrumu ?
-
bütün kontrollerin mouseover voidini override yap. controlun gettype sinden sırayla hangi kontrol olduğunu bul(button,label,dropdownlist vb)
ondan sonra bulduğun kontrolü gerçek tipine çevir Label lbl=(Label)control şeklinde. oradan da lbl.Id ile id sini çek.
bu kadar uzun yazdığıma bakma çok basit.
-
temizle clickte sana sender ile kimin yolladığı gelecek. oradan ayırt edebilirsin. bi üst mesajda var.
üst mesajda override bilmem ne gerek yok. direk olarak click içinde gelecek sender
-
SharpShooter bunu yazdı:
-----------------------------temizle clickte sana sender ile kimin yolladığı gelecek. oradan ayırt edebilirsin. bi üst mesajda var.
üst mesajda override bilmem ne gerek yok. direk olarak click içinde gelecek sender
-----------------------------:) ben başlığı okudum ve direk daldım. tıklamasına gerek kalmadan hangi controlün üstünde olduğunu bulması gerektiğini anlattım. ama demekki mesajıda okumak gerekiyormuş :) başlık biraz eksik olmuş :)
sorunun net cevabına gelince :
Control cnt = (Control)sender; switch (cnt.GetType().Name.ToString()) { case "TextBox": TextBox txt = (TextBox)cnt; //işlemler break; case "Button": Button btn = (Button)cnt; //işlemler break; case "Label": Label lbl = (Label)cnt; //işlemler break; }
-
teşekkürler beyler sender ile yapabildim :)
Control _control = ((ContextMenuStrip)((ToolStripMenuItem)sender).Owner).SourceControl;
ile control alıp _control.GetType().Name controlün ne olduğu _control.Name ile control adı alınabiliyor.
//ÖRNEK
Control _control = ((ContextMenuStrip)((ToolStripMenuItem)sender).Owner).SourceControl;
switch (_control.GetType().Name)
{
case "DataGridView"://......
break;
}