Keresés
Hírlevél
 
Kiemelt témák
»Hogy viszonyul ehhez a család?
»Legjobb metodika emberi relációk tárolására
»A programozó hibája, hogy törik a programját?
»Jogosultság kezelés mezőszinten
Állás/munka
»Wordpress szakértőt keresünk
»Kamu álláshirdetők listája
»Front-end fejlesztő / Sitebuilder
»DataStore Developer
»PHP programozó, webfejlesztő munkát keres
» több téma
Tudástár
?XML-ből sok szövegmező
Oldalon keresés 8x írja ki az eredményt
?Input mezőből visszakapott adat probléma
TinyMCE és az ékezetek
?Rengeteg hasonló kép betöltése gyorsan (PHP)
Ékezetes kar. nem minden táblában jól
?Shelltreeview gond
Grafikon rajzolás probléma
?Onclick= php függvény
?Egyenes megrajzolása
?Access-ből adott xml fájl kinyerése
Listázás időpont szerint
Exportálás változó könyvtárba
*Link eredményének kiolvasása
Imagemapre képet
» több téma
Társalgó
»A programozásból jól meg lehet élni?
»MFC tanulás
»Könyvet adok-veszek
»Hogy viszonyul ehhez a család?
»Nintendo wii
»Letölthető az új Rad Studio XE és Delphi XE
»Weblap véleményezés
»Játékmotor elmélet
»Informatikai bulvárlap
»Delphi-ről C++-ra váltás
» több téma
ASP  |  C#  |  C++  |  CSS  |  Delphi  |  Flash  |  HTML  |  Java  |  JavaScript  |  Pascal  |  Perl  |  PHP  |  Python  |  Visual Basic  |  Visual C++  |    »    

Tudástár

»

Eseménykezelés, form és usercontroll kapcsolat

»

Eseménykezelés, form és usercontroll kapcsolat

nyitotta: Pii-L, idő: 2010.03.11., moderátor: moderator
  Értesítés változás esetén Felvétel kedvencekhez Küldés emailben Nyomtatható verzió

Kategóriák:Programozási nyelvek » C#

Sorrend:
Időzóna:
Blokkméret:
Sziasztok,

Egy winform alkalmazást készítek, amire egy négyzethálót, sakktábla szerűséget rajzolok. A tábla kialakításához nem használtam semmi System.Windows.Drawing.Graphics osztályt, hanem kicsi négyzet alakú usercontroll-okat helyezek el a winformon 2 egymásba ágyazott for ciklussal. Ezt azért csináltam, mert így van a usercontroll-nak mindenféle mouse eseménye, pl.: kattintáskor megváltoztatom a háttérszínét a usercontroll-nak.

Ez idáig megvan, viszont szeretnék olyat, hogy a form-on kijelölök egy checkbox-ot, vagy egy szint, stb. Majd ezután amikor a usercontrollra kattintok, akkor szeretném, hogy erre a színre színeződjön ki a usercontrollnak a háttere.

winform-on megvalósított usercontrollok:

Negyzet_controll nc;
for (int i = 0; i < 26; i++)
{
    for (int j = 0; j < 26; j++)
    {
        nc = new Negyzet_controll();
        nc.Size = new Size(15, 15);
        nc.Location = new Point((j * 16) + 16, (i * 16) + 16);
        nc.NC_Name = new int[2] { i, j };
        this.Controls.Add(nc);
    }
}

usercontroll.cs
public partial class Negyzet_controll : UserControl
{
    private int[] nc_name;
    public int[] NC_Name
    {
        get { return this.nc_name; }
        set { this.nc_name = value; }
    }

    public Negyzet_controll()
    {
        InitializeComponent();
    }

    private void Negyzet_controll_MouseClick(object sender, MouseEventArgs e)
    {
        this.BackColor = (this.BackColor == Color.Blue) ? Color.LawnGreen : Color.Blue;
    }

}
Jelenleg, egyszerűen csak kékre színezem click esetén, majd utána, ha még egyszer rája kattintok, akkor vissza az eredeti usercontroll háttérszínére, ami jelen esetben LawnGreen. (Bár lehetne tökmindegy...)

A Negyzet_controll adattagja azért vannak, hogy később tudjak rájuk hivatkozni, jelenleg a négyzet koordinátáit tartalmazza.

Segítséget előre is köszönöm.
Így?

Color c;
...

if(checkBox.Checked){
c=Color.Red;
}
else{
c=Color.Green;
}
...
private void Negyzet_controll_MouseClick(object sender, MouseEventArgs e)
    {
        this.BackColor = c;
    }
Vagy készítesz egy propertyt (mondjuk KellSzinezniClickre [bool]) és amikor checkkelik a chekboxot akkor átállítod true-ra és ettől függően clickre változtatod a színt, vagy delegate-el készítesz eseményt a kontrolnak és akkor az adott formon készíthetsz neki saját eseménykezelőt.

Morzel
Helló,

Majdnem jó, a baj ezzel, hogy a usercontroll-nak nincs checkbox eleme!
A checkbox a formon helyezkedik el.
Úgy gondoltam hogy ezt:

if(checkBox.Checked){
c=Color.Red;
}
else{
c=Color.Green;
}
a Negyzet_controll_MouseClick eseményén belülre tedd.
Helló Morzel,

Valamikor, régen még úgy tanultam, hogy kell hozza deleget + event-et írni, sajna erre nem emlexem. A google sok mindenre ad példát, de nem igazan hasonlít arra amit én szeretnek. Vagy az is előfordulhat, hogy rosszul értelmezem és implementálási nehézségeim vannak.

A usercontrolnak pont az lenne a lényege, hogy neki már megírták az EventHandler-jét + a velejáró delegetet, stb :) azt hiszem, szal csak hasznalni kell. Még dereng olyan is, hogy az eseménykezelőben a sender object-et castolom es meghiv egy másik metódust aztán hajra, de ... - azt hiszem itt kezdődnek az én problémáim.

Nem tudom, mennyire volt érthető, amit írtam
Nem tudom, mennyire volt érthető, amit írtam
Elég zavaros.


Valamikor, régen még úgy tanultam, hogy kell hozza deleget + event-et írni, sajna erre nem emlexem. A google sok mindenre ad példát, de nem igazan hasonlít arra amit én szeretnek. Vagy az is előfordulhat, hogy rosszul értelmezem és implementálási nehézségeim vannak.

Olvasd el a linket amit adtam.


A usercontrolnak pont az lenne a lényege, hogy neki már megírták az EventHandler-jét + a velejáró delegetet, stb :) azt hiszem, szal csak hasznalni kell.

És szerinted ha te készíted a USERControlt akkor annak már meg lesz írva a felhőből az működése?

Még dereng olyan is, hogy az eseménykezelőben a sender object-et castolom es meghiv egy másik metódust aztán hajra, de ... - azt hiszem itt kezdődnek az én problémáim.
Vagy ott hogy először nekiállsz programozni és amikor elakadsz se jut az eszedbe hogy vegyél egy asp.net-el foglalkozó könyvet. Mondjuk ehhez képest még mindig jobban teljesítesz mint a heti átlag. Te legalább nem hiszed azt hogy php, már az is valami...

Morzel
Helló vinie,

Lehet, hogy én értek félre valamit, de a Negyzet_controll_MouseClick eseményen belül

if(checkBox.Checked){
c=Color.Red;
}
else{
c=Color.Green;
}

a checkBox.Checked, hol található es mit ellenőriz?
A Negyzet_controll : usercontroll -> és a negyze_controll.cs file-ban található.
A Form1 : Form -> pedig egy program.cs (talán) fileban található, és a checkbox ezen a winform-on található. A usercontrollon nincs checkbox, aminek ellenőrizhetném a tulajdonságát. Egy közös tulajdonsággal rendelkeznek ezek az osztalyok, mégpedig, hogy egy névtérben vannak. Ergo elméletileg tudnám piszkálni úgy hogy névtér.Form1.checkbox ... De nem
Közben szembesültem azzal hogy winforms. Nem baj, a dallam ugyanaz.

Morzel
Bocs, kissé figyelmetlen voltam. Szóval, ha a Form-on mondjuk "cb1" a checkbox neve akkor így eléred:


private void Negyzet_controll_MouseClick(object sender, MouseEventArgs e)
        {
          CheckBox  chb = (CheckBox)this.Parent.Controls["cb1"];
            if (chb.CheckState == CheckState.Checked)
            {
                this.BackColor = Color.Red;
            }
            else {
                this.BackColor = Color.Blue;
            }
           
        }
Jó reggelt

Tudom, hogy az olvasás, nagyon hasznos, és hidd el, hogy sok könyvecske figyel a polcomon c# témakörében, illetve jómagam is szeretem a papíralapú könyveket.
Lehet hogy az én memóriámmal van a baj, vagy a könyvek írójával, de ha fellapozol pár ilyen könyvet, akkor meglátod, hogy az eseménykezelésről nem több mint 6 - 10 oldalt írnak és akkor aztán minden benne van. A többit a szerző a fantáziádra bízza, valamint a talpraesettségedre. (természetesen az is előfordulhat, hogy nem megfelelő könyveket forgatok a kezemben)
Az alábbi utasítást azt hiszem sehol nem olvastam (könyvben), és ez volt az amit kerestem:

private void Form1_MouseClick(object sender, MouseEventArgs e)
        {
                 Color szin = ... // szín beállítás
                 (sender as Negyzet_controll).Hatterszin(szin);
        }

Tehát a Form1-nek az eseményére iratkozom fel és azt cast-olom usercontroll-ra és jól meghívom a usercontrol egy public metódusát, ami már nyugodt szívvel piszkálja a önmagát.

Félreértés ne essék, nagyon köszönöm a segítségedet, csak van úgy, hogy az ember nem google-zni akar, hanem hozzáértő emberek segítségét kérni és kicsit tanulni.
Szóval köszi még egyszer a hozzászólásokat és a segítséget, remélem nem bántottalak meg reggeli véleményemmel.
Jó reggelt neked is

Köszi a segítséget, ugyan közben megtaláltam a megoldást, amit kerestem, lásd válaszom Morzel__-nek. Ugyanakkor ez is jó megoldás, úgyhogy értékelem.
Belépés
E-mail cím:
Jelszó:

RSS források
-Hírek
-Cikkek
-Fórumok
-Állás/munka
Top pontgyűjtők
»Micu1.030
»Interlock280
»mezofi150
»Pitta_100
»Frostech0100
»szbzs.2100
»Riha60
»Akhiles50
»mrchandra50
»Bakter50
Top wikieditorok
»Sting
»Doi
»FlamingClaw
»Argathron
»Csaboka2
»Vodka
»Joexy
»Ivn
»Balucinho
»Kelemzol
» ugrás a wikire
A nap kifejezései
»Algoritmus
»Hogyan kezdjem el
»Perl
» ugrás a wikire
Hírek
»Megérkezett a PostgreSQL 9.0 kiadásra jelölt változata
»Letölthető az új Rad Studio XE és Delphi XE
»Function-X digitális művészeti találkozó és demoscene party
»Webfejlesztőknek szóló közösségi oldalt indított a Microsoft
»Letölthető a hardvergyorsított Chrome 7 első fejlesztői kiadása
» több hír
PC Fórum hírek
»Itt az első kép az AMD nyolcmagos processzoráról
»"Szuperdizájnos" érintő-egeret mutatott be a Microsoft
»Szabadalmaztatta a számítógép kikapcsolását a Microsoft
»Vírusriadót váltott ki a webezőknél a Google
»Ingyen iWiW-ezhetnek mobiljaikról a T-Mobile-osok
»Automatikusan kiválogatja legfontosabb leveleink a Google
»OOo4Kids - ingyenes Office csomag gyerekeknek
»Új, gyorsabb Core i3 és Pentium processzorokat jelentett be az Intel
Tagi blogok
»PSP
»Első Programozó
»USB
»PHP, mint sablonmotor egyszerűen