68manu
Messages postés43Date d'inscriptionsamedi 20 septembre 2008StatutMembreDernière intervention 1 octobre 2008
-
28 sept. 2008 à 22:57
68manu
Messages postés43Date d'inscriptionsamedi 20 septembre 2008StatutMembreDernière intervention 1 octobre 2008
-
29 sept. 2008 à 21:13
Bonsoir,
voici trois jours que je me prends la tete sur les formulaires MDI. Et malgre les bonnes sources et tutoriaux presents, je n'ai pas trouve chaussure a mon pied alors je soumets ma migraine a votre sagacité.
Je vous explique le plus clairement possible mon probleme :
J'ai un formulaire MDI qui peut generer plusieurs formulaires enfants identiques dans leur apparence. Toutefois chaque formulaire enfant doit pouvoir gérer de facon indépendante les données recueillies, d'autant plus qu'il y a pas mal de controles différents (ca va du Timer, au DataGridView, Combobox, Boutons, et j'en passe et des meilleures). Mon idée est de gérer plusieurs tournois de ping-pong en même temps (ex : tournoi jeunes, tournoi adultes, tournoi Veterans...etc...). Bien sûr je souhaitais visualiser chaque tournoi dans un formulaire enfant MDI en meme temps, car il se peut qu'a un instant donne plusieurs tournois aient lieu en meme temps.
J'ai l'impression que d'avoir plusieurs fenetres MDI enfant ouvertes ayant le meme code de développement gène l'ordinateur, comme si du coup au premier changement de variable, il y a un confusion et qu'il ne sait pas apres sur quel formulaire il doit appliquer le changement de variable.
Je dois preciser que tout le code fonctionne parfaitement quand je n'utilise qu'un formulaire enfant a la fois.
Description du projet :
Issu Classe FormulaireMDI Parent :
' Gestion d'un nouveau tournoi
Private
Sub ShowNewForm(
ByVal sender
As
Object,
ByVal e
As EventArgs)
Handles NewToolStripMenuItem.Click, BtnAjouterTournoi.Click
' Creez une nouvelle instance du formulaire enfant.
Dim NouveauTournoi
As
New NewTournament
' Cree une nouvelle feuille de match (NewTournament, est une classe formulaire)NouveauTournoi.WindowState = FormWindowState.Maximized
m_ChildFormNumber += 1
NouveauTournoi.Text "Tournoi des " & Categorie(m_ChildFormNumber)' Categorie est une variable tableau de constantesNouveauTournoi.Name
"Tournoi" & m_ChildFormNumber
' Lancement de ma boite de parametrage du tournoi
' Elle a pour effet d'initialiser une astuce qui me permet de reconnaitre les differents formulaires enfants
' Est genere entre autre la variable tableau TYPETOURNOI()
' A chaque appel de DlgBox1, je REdim Preserve TYPETOURNOI en augmentant le tableau de 1 entree que j'initialise avec NouveauTournoi.text
DlgBox1.Name =
"DlgBoxP" & m_ChildFormNumber
If DlgBox1.ShowDialog = Windows.Forms.DialogResult.Cancel
Then
Exit
Sub
End
IfDlgBox1.Dispose()
NouveauTournoi.Show()
End
Sub
Extrait Classe Formulaire Enfant NewTournament (Appel par NouveauTournoi)
Private
Sub NewTournament_Load(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles
MyBase.Load
' on recupere le numero du tournoi
' Celle valeur est toujours equivalente au m_ChildNumber d'au dessus et me permet de reconnaitre les parametres de TYPETOURNOI(), et SURTOUT le formulaire enfant correspondant
' Pour simplicite, je donne l'exmple du DatagridView, mais c'est la meme chose pour tous les controles :
' l'initialisation ne pose jamais de problemes, la modification en pose
' Donc ici j'ai un formulaire avec un DataGridView appele dgv
numerotournoi =
CInt(
Me.Name.Substring(7,
Me.Name.Length - 7))
' on initialise les controles
ForEach objet InMe.Controls
objet.visible =
False
Next
Select Case TYPETOURNOI(numerotournoi)
Case "Jeunes"
InitialiserDgv("Jeunes",150,400,Color.Blue,Color.Lavender,Color.LavenderBlush) 'on initialise le controle DataGRidview, pas de soucis les initialisations, ca marche pour tous les nouveaux formulaires
' Autres initialisations selon le cas du type de tournoi
Case "Adultes"
InitialiserDgv("Jeunes",150,400,Color.Salmon,Color.SandyBrown,Color.LightPink)
...
End Select
End sub
' Admettons que lors de l'utilisation du formulaire gerant le tournoi Jeunes, vous voulez Checker le gagnant
' Et la bonne blague ...vous gerez aussi un tournoi Adultes.
Private sub Dgv_Cellcontentclick(Byval sender asSystem.Object,
ByVale
AsSystem.Windows.Forms.DataGridViewCEllEventArgs)
HandlesdgvRencontre.CellContentClick
Dim ligne
As Integer=e.RowIndex
' C'est cette modification qui ne s'opere pas, et sur aucun des formulaires a partir du moment
' ou il y en a au moins deux en meme temps.
' Ceci est valable pour n'importe quel controle
dgv.Rows(ligne).cells("Vainqueur").Value= True
End sub
1. Merci de votre courage pour avoir lu jusque la !
Voici les solutions auquelles j'ai pense et qui sont "triviales"
a. Mon formulaire est precréé avec le Concepteur -> Dois je faire toute la creation via le code ?
A vrai dire j'aimerais une autre solution
b. J'utilise une astuce similaire a celle qui me permet de reconnaitre mes formulaires, pour rappel le variable numerotournoi
Mais cela veut dire qu'il me faut des Arrays de formulaires, cela est il possible ?
c. Demander humblement de l'aide sur ce point. Je sais qu'il existe une solution, sinon aucune application ne pourrait utiliser deux fenetres enfants en meme temps.
gillardg
Messages postés3275Date d'inscriptionjeudi 3 avril 2008StatutMembreDernière intervention14 septembre 20142 29 sept. 2008 à 00:22
pourquoi ne pas faire le design tes forms à l'avance, chacune ayant ses spécificités et simplement les appeler au moment ou tu en as besoin
exemple
1 form parent
1 form tournoi enfants
1form tournoi adultes
1 form tou......
1 .....
1.....
dans le menu de form_parent tu mets le code qui te permet d'appeler chacun de ses enfants
68manu
Messages postés43Date d'inscriptionsamedi 20 septembre 2008StatutMembreDernière intervention 1 octobre 2008 29 sept. 2008 à 08:54
Bonjour gillardg,
merci de ta reponse, c'est en effet la solution qui parait la plus simple par rapport a ce que j'ai expose.
Mais en me relisant apres, j'ai remarque que j'avais oublie de preciser quelque chose :
Chaque type de tournoi peut etre categorise encore selon le classement ou encore selon le sexe, etc...
.
Ce qui fait que j'ai par exemple que je peux avoir deux tournois jeunes, l'un pour les debutants, l'autre pour des plus forts, etc...ou un tournoi adulte feminin et masculin ou mixte...
Etant donne la multiplicite > 50 possibilites, je ne peux bien evidemment pas faire un formulaire par tournoi. L'application deviendrait vite tres "lourde". Sans compter, pour corser le truc, que l'utilisateur ne pourrait pas gerer un tournoi A ou B ayant les memes specificites (ex : un tournoi adulte feminin a 8 joueuses et un autre tournoi adulte feminin a 14 joueuses), ca ne fait que repousser le probleme plus loin.
J'aimerais quelque chose de plus dynamique si possible.
J'espere vraiment qu'il y a une solution autre.
cordialement,
Emmanuel
_____________________
No problems, only soluces
68manu
Messages postés43Date d'inscriptionsamedi 20 septembre 2008StatutMembreDernière intervention 1 octobre 2008 29 sept. 2008 à 21:13
Je crois qu'a defaut d'etre bouche bee... Je suis fondamentalement c...
comment modifiez vous un dgv qui a la propriete EditModeProgramatically a l'instant ou l'utilisateur veut cliquer dessus ? Et quand les autres controles sont en mode enabled=false.
Comme je le dis si bien il n'y a pas de problemes que des solutions:::
Ce qu'il faut c'est savoir regarder la solution pour comprendre le probleme.
Desole gillardg pour le derangement. Vivement que ce projet se termine, que je puisse enfin prendre quelques jours de vacances... J'en ai besoin !
En tout cas j'accepte la solution proposee, car finalement au probleme expose c'est la bonne solution :-)