cedric3333
Messages postés4Date d'inscriptionsamedi 18 avril 2009StatutMembreDernière intervention20 avril 2009
-
18 avril 2009 à 15:31
cedric3333
Messages postés4Date d'inscriptionsamedi 18 avril 2009StatutMembreDernière intervention20 avril 2009
-
20 avril 2009 à 09:19
Bonjour a tous,
voila j'ai un problème depuis plusieurs mois que j'avais laissé de coté en me disant que je trouverai la solution plus tard. Mais bon voila je n'arrive toujours pas a le résoudre, et c'est tres important poru moi de trouver la solution. En fait j'ai un Panel1 constitué de 2 UserControl :
Le 1er : UserControl constitué d'un label et d'un textBox
Le 2eme : UserControl constitué d'un Label, une combobox et un bouton (avec une image).
Quand je clique sur le Bouton dans le UserControl2 je crée un Panel1 (donc constitué des 2 UserControl) et ainsi de suite. Ceci me permet d'afficher des hiérarchies. Si je fais 13 fois l'opération je prends le message d'erreur "Erreur lors de la création d un handle de fenêtre".
Voici comment reproduire le problème simplement. Avec cet exemple ca plante au niveau 45.
1) créer une applicaiton WinForms, avec un Form1. Mettre :
privatevoid Form1_Load(object sender, EventArgs e)
{
this.autoscroll = true
MonControl MonControl1 = new MonControl(1);
this.Controls.Add(MonControl1);
}
Puis créer la classe suivante :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
class MonControl :Panel
{
public TextBox MaTextBox = new TextBox();
private Button MonBouton = new Button();
public MonControl(int nIdent)
{
this.MaTextBox.Dock = System.Windows.Forms.DockStyle.Top;
this.MaTextBox.Location = new System.Drawing.Point(0, 0);
this.MaTextBox.Size = new System.Drawing.Size(601, 20);
this.MaTextBox.TabIndex = 0;
this.MonBouton.Dock = System.Windows.Forms.DockStyle.Right;
this.MonBouton.Location = new System.Drawing.Point(526, 20);
this.MonBouton.Size = new System.Drawing.Size(75, 26);
this.MonBouton.MaximumSize = new System.Drawing.Size(75, 26);
this.MonBouton.TabIndex = 1;
this.MonBouton.Text = "MonBouton";
this.MonBouton.UseVisualStyleBackColor = true;
this.MonBouton.Click += new EventHandler(MonBouton_Click);
this.Controls.Add(this.MonBouton);
this.Controls.Add(this.MaTextBox);
this.Dock = System.Windows.Forms.DockStyle.Top;
this.Location = new System.Drawing.Point(0, 0);
this.Name = nIdent.ToString();
this.Size = new System.Drawing.Size(601, 46);
}
void MonBouton_Click(object sender, EventArgs e)
{
this.PushButon();
}
publicvoid PushButon()
{
int nsave = this.Height;
MonControl MonControl1 = new MonControl(Convert.ToInt32(this.Name) + 1);
MonControl1.Dock = System.Windows.Forms.DockStyle.Bottom;
MonControl1.MaximumSize = new Size(this.Width - 10, 20000000);
this.Controls.Add(MonControl1);
this.Height += MonControl1.Height;
if(this.Parent.GetType() == typeof(MonControl))
(this.Parentas MonControl).AjusterHauteur(nsave);
MonControl1.MaTextBox.Text = MonControl1.Name;
MonControl1.MaTextBox.Focus();
MonControl1.PushButon();
}
publicvoid AjusterHauteur(int nsave)
{
int nsave2 = this.Height;
this.Height += this.Controls[this.Controls.Count - 1].Height - nsave;
if(this.Parent.GetType() == typeof(MonControl))
(this.Parentas MonControl).AjusterHauteur(nsave2);
}
}
}
A lexecution, cliquer sur le bouton et le reste se fait tout seul jusqu'au plantage.
Quelqu'un pourait m'aider?
Merci bp
Cédric
cs_Robert33
Messages postés834Date d'inscriptionsamedi 15 novembre 2008StatutMembreDernière intervention14 janvier 201733 19 avril 2009 à 21:12
Bonsoir
C'est étrange, cela ne devarit pas planter aussi vite.
J'ai essayé ton code et effectivement ça plante à 46 iterrations.
Mais je me demande si le probleme vient du nombre de controles ou de la profondeur des user-controles.
J'ai fais le test suivant:
Modification du constructeur pour passer la forme Parent
Au lieu d'ajouter le nouvel MonCcontrol dans la liste des controles de son Parent, je l'ajoute à celle de la Form mère, et là je n'ai plus de plantage, mais par contre j'ai un probleme de performance au dessus de 128 iterrations.
J'ai limitter le nombre d'iterrations à 255, et j'ai effectivement ces 255 MonControl d'affichés.
class
MonControl
: Panel
{
public TextBox MaTextBox = newTextBox();
private Button MonBouton = newButton();
Form _ParentForm = null;
private staticint counter = 0;
public MonControl(int nIdent, Form parent)
{
counter++;
_ParentForm = parent;
...
}
public
void
PushButon()
{
...
_ParentForm.Controls.Add(MonControl1);
...
if (counter < 255)
MonControl1.MonBouton.PerformClick();
}
...
}
cedric3333
Messages postés4Date d'inscriptionsamedi 18 avril 2009StatutMembreDernière intervention20 avril 2009 20 avril 2009 à 09:19
Bonjour,
merci beaucoup pur ta réponse. C'est effectivement tout mon probleme : la profondeur m'est tres utile et est tres importante. Ce qui me gene c'est que dans mon exemple ca plante au niveau 46 mais dons mon programme (qui est plus complexe) ca plante au niveau 12, et ca c'est tres pénalisant. Tu pense que c'est une limitation du système?
Cédric