Wiedermal Events -.-



  • Wir haben ein Formular mit einem Treeview auf der linken Seite. Rechts sind Eingabefelder umrahmt von einer GroupBox. Weiterhin habe ich oben noch ein MainMenu.
    Sobald ich links ein Node im TreeView wähle, erscheinen rechts die Daten zu jenem Welchen...
    Andersrum sollen natürlich geänderte Daten wieder in das zum Node gehörigen Object gesichert werden.

    Wir widmen uns nun der Philosophie der Eingabesicherung:

    1. Databinding oder Dataset kommt nicht in Frage, da es einige unangenehme bugs aufweist, die umständlich gelöst werden müssen. (Brauchen wir nicht drüber zu diskutieren - aus, ende, basta)

    2. Jetzt gibt es die wirklich schöne Möglichkeit das Event "Leave" aus der GroupBox zu verwenden. Man sollte meinen, es tritt wirklich immer dann auf, wenn die GroupBox (oder deren Controls) den Focus verliert. So könnte man dann alle Eingaben in einer einzigen Funktion dem Node-Object zuweisen. Tut es aber leider nicht! Das Leave-Event tritt zum Beispiel dann nicht auf, wenn ich von der GroupBox in das MainMenu wechle.

    3. Ich erzeuge für jede TextBox ein OnChange, für jede ComboBox ein OnSelect usw. Das ist aber der unangenehme Weg mit wenig Dynamik und viel Code.

    4. Es gibt ein sauberes Event was ich suche, aber nicht kenne

    5. C# is very buggy!

    Leider haben auch LeaveEvents die ärgerliche Eigenschaft, nicht zum richtigen Zeitpunkt zu "zünden". So hab ich zB das Problem bei einem TreeView, daß dieses erst den neuen Select erhält und danach erst das LeaveEvent des vorherigen Controls anspringt.

    Denken Sie bitte drüber nach und helfen Sie einem verwirrten C#-User!



    1. C# is very buggy!

    Was hat denn das mit C# zu tun? Das sind Events, die vom Betriebssystem ausgelöst werden.
    Und die sind seit '95 wahrscheinlich unverändert. Das ist nicht buggy, sondern nur anders, als du es gerne hättest.

    Das Leave-Event tritt zum Beispiel dann nicht auf, wenn ich von der GroupBox in das MainMenu wechle.

    Dadurch verlierts ja auch nicht den Focus, oder? Es hindert dich aber keiner daran, den Delegaten für das Leave-Event manuell aufzurufen, wenn jemand was im Menü macht.

    Zu guter Letzt: Es in Foren wie diesen hier üblich, dass man sich duzt.



  • CGurkenSalat_ schrieb:

    Databinding oder Dataset kommt nicht in Frage, da es einige unangenehme bugs aufweist, die umständlich gelöst werden müssen.

    Also, als gut gelungen würde ich das Binding-Framework auch nicht bezeichnen - aber bugs ...?

    CGurkenSalat_ schrieb:

    So hab ich zB das Problem bei einem TreeView, daß dieses erst den neuen Select erhält und danach erst das LeaveEvent des vorherigen Controls anspringt.

    Kann ich nicht nachvollziehen. Ein kleines Testprojekt (eine TextBox und eine TreeView) ergibt:
    1. Event: Leave der TextBox
    2. Event: AfterSelect der TreeView

    kannst Du eine Konfiguration angeben, die das Verhalten reproduziert?



  • Optimizer schrieb:

    1. C# is very buggy!

    Was hat denn das mit C# zu tun? Das sind Events, die vom Betriebssystem ausgelöst werden.
    Und die sind seit '95 wahrscheinlich unverändert. Das ist nicht buggy, sondern nur anders, als du es gerne hättest.

    Aber warum hatte ich damit in C++ keine Probleme?

    Optimizer schrieb:

    Das Leave-Event tritt zum Beispiel dann nicht auf, wenn ich von der GroupBox in das MainMenu wechle.

    Dadurch verlierts ja auch nicht den Focus, oder? Es hindert dich aber keiner daran, den Delegaten für das Leave-Event manuell aufzurufen, wenn jemand was im Menü macht.

    Ja stimmt. Das ist so gewollt. Sorry, war wohl sehr müde 🙂

    dschensky schrieb:

    CGurkenSalat_ schrieb:

    Databinding oder Dataset kommt nicht in Frage, da es einige unangenehme bugs aufweist, die umständlich gelöst werden müssen.

    Also, als gut gelungen würde ich das Binding-Framework auch nicht bezeichnen - aber bugs ...?

    Ja, zum Beispiel wird der angezeigte Name einer Liste beim ändern nicht aktualisiert.

    dschensky schrieb:

    CGurkenSalat_ schrieb:

    So hab ich zB das Problem bei einem TreeView, daß dieses erst den neuen Select erhält und danach erst das LeaveEvent des vorherigen Controls anspringt.

    Kann ich nicht nachvollziehen. Ein kleines Testprojekt (eine TextBox und eine TreeView) ergibt:
    1. Event: Leave der TextBox
    2. Event: AfterSelect der TreeView

    kannst Du eine Konfiguration angeben, die das Verhalten reproduziert?

    Also hier mal ein kleines Testprogramm. Im LeaveEvent der Groupbox gebe ich den selektierten Node aus. Es ist aber schon das neu selektierte Item. Beim Leave der Textbox passiert btw das gleiche.

    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    
    namespace TestForm
    {
    	/// <summary>
    	/// Summary description for Form1.
    	/// </summary>
    	public class Form1 : System.Windows.Forms.Form
    	{
    		private System.Windows.Forms.GroupBox groupBox1;
    		private System.Windows.Forms.TreeView treeView1;
    		private System.Windows.Forms.TextBox textBox1;
    		/// <summary>
    		/// Required designer variable.
    		/// </summary>
    		private System.ComponentModel.Container components = null;
    
    		public Form1()
    		{
    			//
    			// Required for Windows Form Designer support
    			//
    			InitializeComponent();
    
    			//
    			// TODO: Add any constructor code after InitializeComponent call
    			//
    			treeView1.Nodes.Add( "Nummer 1");
    			treeView1.Nodes.Add( "Nummer 2");
    			treeView1.Nodes.Add( "Nummer 3");
    
    			treeView1.Nodes[0].Nodes.Add( "Nummer 1/1");
    			treeView1.Nodes[0].Nodes.Add( "Nummer 1/2");
    			treeView1.Nodes[1].Nodes.Add( "Nummer 2/1");
    			treeView1.Nodes[1].Nodes.Add( "Nummer 2/2");
    			treeView1.Nodes[2].Nodes.Add( "Nummer 3/1");
    			treeView1.Nodes[2].Nodes.Add( "Nummer 3/2");
    		}
    
    		/// <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 Windows Form 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.groupBox1 = new System.Windows.Forms.GroupBox();
    			this.treeView1 = new System.Windows.Forms.TreeView();
    			this.textBox1 = new System.Windows.Forms.TextBox();
    			this.groupBox1.SuspendLayout();
    			this.SuspendLayout();
    			// 
    			// groupBox1
    			// 
    			this.groupBox1.Anchor = (((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
    				| System.Windows.Forms.AnchorStyles.Left) 
    				| System.Windows.Forms.AnchorStyles.Right);
    			this.groupBox1.Controls.AddRange(new System.Windows.Forms.Control[] {
    																					this.textBox1});
    			this.groupBox1.Location = new System.Drawing.Point(152, 8);
    			this.groupBox1.Name = "groupBox1";
    			this.groupBox1.Size = new System.Drawing.Size(368, 272);
    			this.groupBox1.TabIndex = 0;
    			this.groupBox1.TabStop = false;
    			this.groupBox1.Text = "groupBox1";
    			this.groupBox1.Leave += new System.EventHandler(this.groupBox1_Leave);
    			// 
    			// treeView1
    			// 
    			this.treeView1.ImageIndex = -1;
    			this.treeView1.Location = new System.Drawing.Point(8, 8);
    			this.treeView1.Name = "treeView1";
    			this.treeView1.SelectedImageIndex = -1;
    			this.treeView1.Size = new System.Drawing.Size(136, 272);
    			this.treeView1.TabIndex = 1;
    			// 
    			// textBox1
    			// 
    			this.textBox1.Location = new System.Drawing.Point(88, 16);
    			this.textBox1.Name = "textBox1";
    			this.textBox1.Size = new System.Drawing.Size(264, 20);
    			this.textBox1.TabIndex = 0;
    			this.textBox1.Text = "";
    			this.textBox1.Leave += new System.EventHandler(this.textBox1_Leave);
    			// 
    			// Form1
    			// 
    			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
    			this.ClientSize = new System.Drawing.Size(528, 286);
    			this.Controls.AddRange(new System.Windows.Forms.Control[] {
    																		  this.treeView1,
    																		  this.groupBox1});
    			this.Name = "Form1";
    			this.Text = "Form1";
    			this.groupBox1.ResumeLayout(false);
    			this.ResumeLayout(false);
    
    		}
    		#endregion
    
    		/// <summary>
    		/// The main entry point for the application.
    		/// </summary>
    		[STAThread]
    		static void Main() 
    		{
    			Application.Run(new Form1());
    		}
    
    		private void groupBox1_Leave(object sender, System.EventArgs e)
    		{
    			if (treeView1.SelectedNode == null) return;
    			MessageBox.Show(treeView1.SelectedNode.Text, "Aktuell selektiert...");
    		}
    
    		private void textBox1_Leave(object sender, System.EventArgs e)
    		{
    //			if (treeView1.SelectedNode == null) return;
    //			MessageBox.Show(treeView1.SelectedNode.Text, "Aktuell selektiert...");
    		}
    	}
    }
    


  • CGurkenSalat_ schrieb:

    Aber warum hatte ich damit in C++ keine Probleme?

    Tja, warum Du da keine Problem hattest, kannst auch nur Du wissen. Und wie Optimizer schon anzudeuten versuchte, hat das alles überhaupt nichts mit der Sprache zu tun.

    CGurkenSalat_ schrieb:

    Ja, zum Beispiel wird der angezeigte Name einer Liste beim ändern nicht aktualisiert.

    Das ist einigermaßen unscharf formuliert. Da würde ich empfehlen, etwas genauer zu beschreiben und das ganze dann in einen neuen Thread zu stecken ...

    CGurkenSalat_ schrieb:

    Im LeaveEvent der Groupbox gebe ich den selektierten Node aus. Es ist aber schon das neu selektierte Item.

    Ähm ... also bei mir nicht. (Hätte mich auch gewundert.)



  • hm woran könnte denn das liegen, daß meine Events anders zünden als deine? 😕


Anmelden zum Antworten