08. marts 2005 - 15:37
Der er
15 kommentarer og 1 løsning
Events, virker ikke
Hej... Jeg har et komponent og en form, og i komponentet har jeg lavet nogen events handlere, men det virker ikke rigtig :/ på formen har jeg sat dem... Min kode: using System; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Data; using System.Windows.Forms; namespace WindowsApplication3 { /// <summary> /// Summary description for InspectorBox. /// </summary> public class InspectorBox : System.Windows.Forms.UserControl { public delegate void SettingHandler (int row, string type); public delegate void SelectHandler (int row, string type, string settingValue); public event SettingHandler OnSettingEdited; public event SelectHandler OnAfterSelect; private WindowsApplication3.Inspector inspector; private System.Windows.Forms.Panel panel; /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components = null; public InspectorBox() { // This call is required by the Windows.Forms Form Designer. InitializeComponent(); // TODO: Add any initialization after the InitForm call this.OnSettingEdited += new SettingHandler(settingEdited); settingEdited(0,"hej"); } private void settingEdited(int row, string type) { if (OnSettingEdited != null) MessageBox.Show("hej"); if (OnSettingEdited != null) OnSettingEdited(0,"hej"); } private void afterSelect(int row, string type, string settingValue) { } [CategoryAttribute("Appearance"), DescriptionAttribute("Settings")] public string[] Settings { get { return inspector.Settings; } set { inspector.Height = value.Length * 16; inspector.Settings = value; } } /// <summary> /// Clean up any resources being used. /// </summary> :::DISPOSE DELEN::: :::DESGIN DELEN::: } }
Annonceindlæg fra Computerworld it-jobbank
Mød 3.500+ it-talenter på IT-DAY 2026
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
08. marts 2005 - 16:16
#1
Jeg bliver godt nok lidt forvirret over den kode. Hvorfor opretter du og trigger events i samme klasse som du deklarere dine eventhandlere? Hvis du laver en kontrol der deklarere din event og fyrer dem så er den prut slået i kontrollen. Du skal så ovre i hosten af kontrollen deklarere din handlere: this.OnSettingEdited += new SettingHandler(settingEdited);
08. marts 2005 - 16:20
#2
done... men der kommer intet nu...
08. marts 2005 - 16:45
#3
Kan du ikke smide koden for både den kontrol og så koden for din applikation der holder din kontrol i to adskilte afsnit.
08. marts 2005 - 16:58
#4
using System; using System.Collections; using System.ComponentModel; using System.Drawing; using System.Data; using System.Windows.Forms; namespace WindowsApplication3 { /// <summary> /// Summary description for InspectorBox. /// </summary> public class InspectorBox : System.Windows.Forms.UserControl { public delegate void SettingHandler (int row, string type); public delegate void SelectHandler (int row, string type, string settingValue); public event SettingHandler OnSettingEdited; public event SelectHandler OnAfterSelect; private WindowsApplication3.Inspector inspector; private System.Windows.Forms.Panel panel; /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components = null; public InspectorBox() { // This call is required by the Windows.Forms Form Designer. InitializeComponent(); // TODO: Add any initialization after the InitForm call //this.OnSettingEdited += new SettingHandler(settingEdited); //settingEdited(0,"hej"); } private void settingEdited(int row, string type) { if (OnSettingEdited != null) MessageBox.Show("hej"); if (OnSettingEdited != null) OnSettingEdited(0,"hej"); } private void afterSelect(int row, string type, string settingValue) { } [CategoryAttribute("Appearance"), DescriptionAttribute("Settings")] public string[] Settings { get { return inspector.Settings; } set { inspector.Height = value.Length * 16; inspector.Settings = value; } } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if(components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Component Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.panel = new System.Windows.Forms.Panel(); this.inspector = new WindowsApplication3.Inspector(); this.panel.SuspendLayout(); this.SuspendLayout(); // // panel // this.panel.AutoScroll = true; this.panel.BackColor = System.Drawing.Color.Silver; this.panel.Controls.AddRange(new System.Windows.Forms.Control[] { this.inspector}); this.panel.Dock = System.Windows.Forms.DockStyle.Fill; this.panel.Location = new System.Drawing.Point(1, 1); this.panel.Name = "panel"; this.panel.Size = new System.Drawing.Size(148, 148); this.panel.TabIndex = 1; // // inspector // this.inspector.BackColor = System.Drawing.SystemColors.Control; this.inspector.Dock = System.Windows.Forms.DockStyle.Top; this.inspector.Name = "inspector"; this.inspector.Settings = new string[] { "[group:Layout]", "[setting:string]Name:hej"}; this.inspector.Size = new System.Drawing.Size(148, 32); this.inspector.TabIndex = 1; // // InspectorBox // this.BackColor = System.Drawing.Color.Gray; this.Controls.AddRange(new System.Windows.Forms.Control[] { this.panel}); this.DockPadding.All = 1; this.Name = "InspectorBox"; this.panel.ResumeLayout(false); this.ResumeLayout(false); } #endregion } } Form: this.inspectorBox1.OnSettingEdited += new WindowsApplication3.InspectorBox.SettingHandler(this.inspectorBox1_OnSettingEdited); private void inspectorBox1_OnSettingEdited(int row, string type) { MessageBox.Show(row.ToString() + type); }
08. marts 2005 - 18:18
#5
Nu fyrer du ikke nogen events?
08. marts 2005 - 18:22
#6
Hov der var jeg for hurtig. Det kan jeg se du gør:D Kan du ikke sætte et breampoint her OnSettingEdited(0,"hej"); og så lige være helt sikker på du ikke kommer ind i funktionen hos hosten. Din kode ser rigtig ud.
08. marts 2005 - 18:33
#7
den siger den er null, altså den gider ikke kører det der...
08. marts 2005 - 18:49
#8
jeg laver lige et eksempel til dig. Nu husker du at din kontrol skal deklareres offentligt? Smider lige et eksempel om 5 mins.
08. marts 2005 - 18:52
#9
Det her virker men det ligner meget det du gør. Kan dog ikke se hele din host: #region Using directives using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Windows.Forms; #endregion namespace sletmig8 { partial class Form1 : Form { Class1 m_c1 = new Class1(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { m_c1.test(); } private void Form1_Load(object sender, EventArgs e) { m_c1.OnSettingEdited += new Class1.SettingHandler(EventFunc); } private void EventFunc(int i, string s) { MessageBox.Show(s); } } } #region Using directives using System; using System.Collections.Generic; using System.Text; #endregion namespace sletmig8 { public class Class1 { public delegate void SettingHandler(int row, string type); public event SettingHandler OnSettingEdited; public Class1() { } public void test() { OnSettingEdited(2, "hej"); } } }
08. marts 2005 - 18:53
#10
Du kommer ikke til at nedlægge din variabel der indeholder din kontrol?
08. marts 2005 - 18:57
#11
umildbart synes jeg min og din ser fuldstændig ens ud, bortset fra at jeg har OnSettingEdited i contructoren...
08. marts 2005 - 19:02
#12
hmm det virker kun hvis jeg ligger det i en method??? ikke hvis jeg sætter det efter set { fx :/
08. marts 2005 - 19:19
#13
:| Men hvis det virker i en method så kender du vejen frem:D Held og lykke med det.
08. marts 2005 - 19:45
#14
tak, opret svar--
08. marts 2005 - 19:50
#15
svar :D
10. marts 2005 - 14:44
#16
hvorfor er det at du ikke laver din eventhandler som ALLE andre eventhandlere i .Net frameworket er lavet. Det er ikke så pænt med den form for inkonsistens :S Signaturen på en eventhandler bør altid ser sådan her ud: (object, EventArgs) EventArgs kan skiftes ud til en klasse af eget valg der nedarver fra EventArgs og bør altid have suffixen EventArgs. Altså SettingsEventArgs, KeyboardClickedEventArgs osv. Delegaten til eventhandleren bør ligeledes have suffixen EventHandler. Så, ikke SettingHandler, men SettingEventHandler. En event skal ikke hedde OnSettingEditet, men bare SettingEditet. Inde i klassen der har deklæreret event skal der så oprettet en On<eventnavn>(EventArgs)-metode der sørger for at trigge eventen hvis den ikke er null. f.eks. protected void OnSettingEditet(EventArgs e) { if (SettingEditet != null) SettingEditet(this, e); } inde i klassen, når du skal trigge event kalder du så OnSettingEditet(EventArgs) Nå, ikke nogen direkte løsning da jeg kan se der allerede er accepteret svar her, men mere en opfordring til at følge de konventioner der findes. Hvis alle var ligeglade med dem ville det blive et helvede at være programmør da ingen gjorde tingene på den samme måde. Det er en ting Microsoft har gjort rigtig godt, at holde konsistens i .Net frameworket, så skal vi ikke prøve at bibeholde den?
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.