[ ADRENALIN @ 20.07.2008. 23:06 ] @
Kako da pozovem event neke kontrole. Dakle ako recimo imam tekst box, i jedno dugme na formi hocu da kada kliknem dugme u obradi eventa, izazovem dupli klik nad tekst boksom, u obradi duplog klika tekst boksa treba da stoji jedan messagebox i to je sve. Primer nema nikakvog smisla, ali je tacno ono sto meni treba. Da li mogu da pozovem neki dogadjaj neke kontrole kao sto to moze u win32, cini mi se da su to ukinuli u .NET-u.
[ bags @ 20.07.2008. 23:57 ] @
Ako sam dobro razumeo:

Code:

textBox1.DoubleClick += new EventHandler(textBox1_DoubleClick);
button1.Click += new EventHandler(textBox1_DoubleClick);
     
private void textBox1_DoubleClick(object sender, EventArgs e)
{
     MessageBox.Show("Dvostruki klik u textboxu!");

[ ADRENALIN @ 21.07.2008. 07:45 ] @
Dobro, nisam bio dovoljno oprezan u postavljanju probmlema pa cu sad preformulisati. Da li je moguce pozvati event neke kontrole, ne da se dodam u red tog eventa, nego da ga izazovem. Ti si ovo sto sam ja napisao odradio tako, samo si stavio svoju obradu u red eventa i kada se on desi i tvoja obrada se izvrsi. Ali ne tako, da li je moguce da iz nekog dela koda bas izazovem event na nekoj kontroli, znaci kao sto joj windows posalje neki dogadjaj tako da i ja to izazovem. Znam kako bi to moglo u win32, mogao bih da posaljem poruku toj kontroli, ali ne znam da li je to uopste moguce u .net-u.

Hvala na brzom odgovoru :)
[ mmix @ 21.07.2008. 08:59 ] @
Nazalost, ne mozes direktno, po patternu koji koristi MS u frameworku, svi eventi su private i svi metodi koji "izazivaju" event su protected (da bi mogli da se menjaju u nasledjenim klasama). Samim tim ne postoji mogucnost da direktno iz koda pozoves taj metod koji dize event (u tvom slucaju je OnDoubleClick(EventaArgs e) koji dize DoubelClick).

U principu imas dva .net workaround-a:
1. Mozes kroz refleksiju da izazoves poziv protected metoda, mada ovo nije bas "kosher". Da bi sebi olaksao mozes da napravis extension metodu za TextBox.
2. Mozes da napravis class MojTextBox koji nasledjuje TextBox i koji ce da eksponira metod za dizanje eventa kao public, pa ga onda posle pozoves. ONda na formamama umeto TextBoxa iskoristis svoju kontrolu.

Ako hoces da se igras low-level kao kroz Win32, sve winforms kontrole imaju svoj win32 Handle koji je kao IntPtr tip deklarisan u Controls klasi, pa koristeci api interop mozes da posaljes WM_DOUBLECLICK u taj handle, deklaracija ti je:

Code:
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, int lParam);


HandleRef mozes da dobijes od Handle kroz njegov konstruktor. Jedini problem sa ovim je sto je ovo unsafe code.


[ mmix @ 21.07.2008. 09:39 ] @
Ok, zaboravi ono gore, .NET message queue implementacija se ne moze tako lako prevariti, moras da simuliras pravi doubleclick nad textboxom sto ukljucuje slanje 4 poruke
Evo ti mali sample, kad sam vec u ordinaciji.

Code:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, int lParam);
        private const int WM_MOUSEDOWN = 0x201;
        private const int WM_MOUSEUP = 0x202;
        private const int WM_LBUTTONDBLCLK = 0x203;

        private void button1_Click(object sender, EventArgs e)
        {
            HandleRef h = new HandleRef(textBox1, textBox1.Handle);
            SendMessage(h, WM_MOUSEDOWN, 0, 0);
            SendMessage(h, WM_MOUSEUP, 0, 0);
            SendMessage(h, WM_LBUTTONDBLCLK, 0, 0);
            SendMessage(h, WM_MOUSEUP, 0, 0);
        }

        private void textBox1_DoubleClick(object sender, EventArgs e)
        {
            MessageBox.Show("Ovo je textbox doubleclick");
        }
    }


naravno, po specifikaciji WM_* poruke imaju konkretne w i l parametre, ali radi i sa 0,0. Jedina nezgodacija sa ovim je sto ce fokus ostati na textbox-u (zbog prvog WM_MOUSEDOWN)
[ ADRENALIN @ 21.07.2008. 10:20 ] @
mmix bas ti hvala, stvarno si se potrudio. Primetio sam da su sakrili te metode, ali nisam bio siguran. Videcu koji mi nacin najbvise odgovara, za sada mi se najvise svidja ovaj sa slanjem poruka, jer mi je potreban samo hendl i onda radim normalno sa svim kontrolama.
Mada mislim da cu ipak dobro razmisliti sta da iskoristim od ovoga.

Jos jednom puno hvala.