Merci whismeril,
du coup il va bien falloir faire de la génération dynamique de contrôles. Je vais donc commencer par te donner un pseudo-code qui devra te permettre de faire un premier jet, si tu as un souci dans la mise en place de la solution il suffira de revenir ici nous demander (attention, si je vois que t'as fait un c/c à l'arrache, que tu n'as pas cherché à comprendre, je n'aiderai plus).
Donc voici le pseudo-code :
public void FillTable() {
// je récupère ma liste de modules dans un DataReader
// pour chaque enregistrement :
// j'ajoute une ligne d'en-tête à mon contrôle container (je te conseille un TableLayoutPanel)
// je récupère ma liste des matières pour le module en cours dans un autre DataReader
// pour chaque enregistrement :
// je génère mes 4 contrôles (2 TextBox, 1 CheckBox et 1 ComboBox)
// je les identifie de manière à retrouver, plus tard, à quel enregistrement ils correspondent
// je les initialise avec les valeurs trouvées dans la matière en cours
// je les ajoutes à mon container
}
Maintenant voilà un peu de vrai code, qui te montre comment créer tes contrôles dynamiquement, dans le cas précis une TextBox (dr correspond ici à ton deuxième DataReader) :
// on instancie le contrôle
TextBox txtMatiere = new TextBox();
// on lui donne un nom "utile", on imagine que ta table "matières" contient une clé primaire appelée "id"
txtMatiere.Name = "txtMatiere_" + dr["id"].ToString();
// on la remplie avec une autre valeur de la BDD que j'imagine s'appeler "desc"
txtMatiere.Text = dr["desc"].ToString();
// on l'ajoute à notre TableLayoutPanel que j'ai appelé tlayout
// dans cet exemple on ajoute le contrôle dans la première colonne de la première lignes (les paramètres à '0')
tlayout.Controls.Add(txtMatiere, 0, 0);