Créer une datatable dans une classe ou la recevoir en paramètre

Résolu
chambreur Messages postés 30 Date d'inscription mardi 19 août 2008 Statut Membre Dernière intervention 15 mai 2014 - 17 janv. 2014 à 11:39
chambreur Messages postés 30 Date d'inscription mardi 19 août 2008 Statut Membre Dernière intervention 15 mai 2014 - 20 janv. 2014 à 08:54
Bonjour,
Je m'explique:
A ce jour j'ai une datatable que je vais connecter à un datagridview, cela fonctionne bien.
L'ennui c'est que j'ai fait ça dans le code de la winform FormEditScenario_Load(object sender, EventArgs e) et je trouve pas ça très propre, je souhaite passer par une nouvelle classe qui ferait ce travail (traitement du datagridview).
Le problème c'est que pour créer une datatable, j'ai besoin d'avoir une form (sinon il ne connait pas datatable dt = new datatable();). J'ai bien pensé à l'envoyer en paramètre en faisant qque chose du type:

class editdatagridview
    {

        public string[] DatagridviewProcess(datatable dt, datagridview tableau) 
      {
      }


Mais ça ne fonctionne pas non plus.
Une idée?

3 réponses

Whismeril Messages postés 18404 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 mai 2023 623
17 janv. 2014 à 11:59
Bonjour,

plusieur choses, une Form c'est une classe, donc si tu peux y initialiser une tabel tu peux le faire aussi dans une classe perso.

DataTable appartient à l'espace de nom (namespace) System.Data.
Il te suffit d'ajouter cet espace dans la liste des Using tout en haut.

Bien sûr, tu ne sais pas toujours (rarement en fait) dans quel espace de nom tu vas chercher une instruction.

Une fois que tu as écrit
DataTable toto = new DataTable();
tu cliques droit sur DataTable, tu choisis Résoudre et tu cliques sur l'espace de non, celui ci est ajouté automatiquement (si tu travailles avec visual sutdio > 2008)

Concernant les interactions entre classes, passage de données par paramètres, par propriétés, par accesseurs, par évènements etc...

C'est un vaste sujet.
Je t'enverrais ce soir, une liste de tutos à lire.

Quoiqu'il en soit il te faut au moins acceder au datagridview de ta form, quelques exemples:

using System.Windows.Forms;//ici le namespace qui connait les datagridview

namespace WindowsFormsApplication1
{
    class Class4
    {
        DataGridView monDTW;//variable locale privée

        public Class4(DataGridView MonDTW)// passage du paramètre dans le constructeur de la classe
        {
            monDTW = MonDTW;//affectation de la référence à ma variable locale
        }

        public void GetDTW()//acceseur Get
        {
            return monDTW;
        }

        public void SetDTW(DataGridView MonDTW)//asseceur Set
        {
            monDTW = MonDTW;//affectation de la référence à ma variable locale
        }

        public DataGridView DTW//propriété
        {
            get { return monDTW; }
            set { monDTW = value; }
        }
    }
}


et pour les appels
            Class4 titi = new Class4(dataGridView1);//par le constructeur

            titi.SetDTW(dataGridView1);//par les accesseurs
            DataGridView tutu = titi.GetDTW();

            titi.DTW = dataGridView1;//par la propriété
            DataGridView tata = titi.DTW;

1
Whismeril Messages postés 18404 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 mai 2023 623
17 janv. 2014 à 12:00
J'oubliais il est très fortement déconseillé de mettre les varaibles d'une classe public.
Ca implique que l'exterieur peut en faire n'importe quoi, et un jour quand tu devras modifier ce code ce sera source de bugs
0
Whismeril Messages postés 18404 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 30 mai 2023 623
Modifié par Whismeril le 17/01/2014 à 17:54
De rien,

pour le passage de paramètres par évènement, tu as cette source

Pour voir la gestion des accesseurs, des propriétés etc, cette suite de tutos
http://codes-sources.commentcamarche.net/faq/816-proprietes-accesseurs-et-evenements-d-une-classe-1-3-evenements-et-serialisation
http://codes-sources.commentcamarche.net/faq/817-proprietes-accesseurs-et-evenements-d-une-classe-2-3-evenements-avant-un-changement
http://codes-sources.commentcamarche.net/faq/818-proprietes-accesseurs-et-evenements-d-une-classe-3-3-gerer-le-undo-redo-dans-les-applications

Perso, j'utilise les propriétés plutôt que les accesseurs, d'une part ça permet de se servir du binding (voir ici.
D'autre part si tu n'as pas besoin d'une variable interne tu peux écrire une propriété sans.

public double MonDouble {get; set;}


Ca s'utilise exactement comme une variable interne public, sauf que le jour ou tu évolues le code et qu'une variable interne devient utile, l'encapsulage est déjà prêt et ta relation avec l'extérieur ne change pas.

Penser aux balises de coloration syntaxique: bouton <>, préciser le langage :<code csharp>.
Quand la solution est trouvée, mettre la discussion Résolue.
1
chambreur Messages postés 30 Date d'inscription mardi 19 août 2008 Statut Membre Dernière intervention 15 mai 2014
20 janv. 2014 à 08:54
Merci pour tout, je vais lire tout ça
0
chambreur Messages postés 30 Date d'inscription mardi 19 août 2008 Statut Membre Dernière intervention 15 mai 2014
17 janv. 2014 à 15:41
Je suis entièrement d'accord avec toi que une form est une classe et d'ailleurs j'étais vraiment étonné que ça marche pour l'un et pas pour l'autre.
J'ai pas du faire gaffe si en créant ma form ça avait rajouté system.data automatiquement ou bien est ce que c'est moi qui l'ai rajouté manuellement, je m'en rappel plus.
En tout cas, ta solution marche, ça marche nickel désormais.

Pour les interactions entre classe, tu as raison encore une fois, je n'ai pas protégé mon code par flemme et c'est pas bien. Je vais modifier pour mettre mes variables en privée et utiliser les accesseurs.

Merci pour tout
0