Eseménykezelés, form és usercontroll kapcsolat


 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. |
|