Creer un UserControl contenant un Datagridview

Résolu
Signaler
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008
-
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008
-
Bonjour a tous,

Dans le but d'un projet je dois creer ujn usercontrol contenant un datagridview dans le but d'ajouter des fonctionnalité a celui-ci.
Mon soucis est que dans cet objet je dois pouvoir definir la source de données du datagrid depuis l'application qui l'utilisera (comme si j'inserai un datagridview dans mon appli).

Le soucis c'est que je ne trouve pas comment declarer un DataSource. Voici mon code qui vous aidera a comprendre ce que je veux faire :

[Category("Source données"), Browsable(true), Description("Permet de definir la source de données du datagrid")]

public /* declaration du datasource*/ monDataSource
        {
            get
            {
               return this.dataGridView1.DataSource ;
            }
            set
            {
                this.dataGridView1.DataSource = value ;
            }
        }

Pouvez vous m'aidez ?

Merci a tous
duck88

18 réponses

Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
7
Salut duck,
Si ton userControl ne contient qu'un DataGrid et aucun autre contrôle, il te suffireai de dériver d'un DataGrid tout simplement...

En plus d'en ajouter, tu pourrais 'overrider' quelques-une de ses méthodes !!
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Ha oui effectivement, je suis parti du principe que c'était un Control complexe qui contenait, entre autre, un DataGridView.
C'est évident que si tu veux juste spécialisé ton DataGridView, il faut directement dérivé de cette classe et non pas de UserControl !

<hr size="2" />VC# forever
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008

L'ideal en fait serait de pouvoir recuperer/modifier tous les parametres du datagridview que j'ai inserer dans mon usercontrol, est-ce possible de faire cela ?

duck88
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Le DataSource n'est en fait qu'un object !

public object monDataSource
        {
            get
            {
               return this.dataGridView1.DataSource ;
            }
            set
            {
                this.dataGridView1.DataSource = value ;
            }
        }

<hr size="2" />VC# forever
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008

Ce que tu as mis fonctionne bien, j'ai mis cela qui fonctionne aussi :

       public BindingSource DataSource
        {
            get
            {
                return (BindingSource)this.dataGridView1.DataSource;
            }
            set
            {
                this.dataGridView1.DataSource = value;
            }
        }

duck88
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Ben tu peux le caster en plusieurs chose, si tu sais que tu attends un ArrayList par exemple, tu peux écrire :

   public ArrayList DataSource
        {
            get
            {
                return (ArrayList)this.dataGridView1.DataSource;
            }
            set
            {
                this.dataGridView1.DataSource = value;
            }
        }

<hr size="2" />VC# forever
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008

Merci pour ton aide, j'ai un autre soucis sur lequel tu pourra certainement m'aider :
Comment recuprerer le parametrages des colonnes du datagridview ? J'ai essayé ceci :

public Object columns
        {
            get
            {
                return this.dataGridView1.Columns ;
            }
            set
            {
                this.dataGridView1.Columns.Clear() ;
               
            }
        }

Mais cela ne fonctionne absolument pas, aurait tu la solution ?

duck88
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
La property Column retour une DataGridViewColumnCollection :

public

DataGridViewColumnCollection Columns
{

   get
   {
     
return
this.dataGridView.Columns ;
   }

}

<hr size="2" />VC# forever
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008

Oui je sais, mais cet property est en lecture seule, et ont ne peu pas definir le CellType dans les proprietes de chaque colonne

duck88
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Ben dans ce cas tu passes le CellType. Si t'en veux pour chaque colonnes, tu passes une collection de CellType (par ex. List<CellType>) puis tu fais les différentes affectations dans le 'set' de ta property.

<hr size="2" />VC# forever
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008

L'ideal, si c'est possible,  serait d'avoir toutes les property du datagrid dans les property de l'usercontrol.
Est ce possible de faire cela ?

duck88
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Non, ce n'est pas possible tel quel.
La seule solution qui se rapproche le plus à ça, et de faire une property public qui retourne directement le datagrid en entier (à mettre donc dans le userControl) :

public DataGridView DgGridView
{
   get { return this._dgGridV; }
   set { this._dgGridV = vallue; }
}


<hr size="2" />




VC# forever
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008

C'est ce qu'il me faut, mais quand j'utilise mon usercontrol dans une autre appli et que je veux modifier les colonnes j'ai l'erreur suivante :
"La réference d'objet n'est pas definit a une instance d'un objet"

duck88
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Bon j'ai fait un test très très rapide.
Un userControl comme ça (juste avec un datagridview dessus):

public
partial
class
UserControl1 :
UserContro
{
  
public UserControl1()
   {
      InitializeComponent();
   }

   public
DataGridView Test
   {
     
get {
return
this.dataGridView1; }
     
set {
this.dataGridView1 =
value; }
   }
}
Puis, dans la form de test :

public
partial
class
Form1 :
Form
{
  
DataTable dt =
new
DataTable();
  
public Form1()
   {
      InitializeComponent();
      dt.Columns.Add(
"int",
typeof(
int));
      dt.Columns.Add(
"string",
typeof(
string));
      dt.Rows.Add(3,
"sting");
      dt.Rows.Add(33,
"stding");
      dt.Rows.Add(23,
"stdsaing");
     
this.userControl11.Test.DataSource = dt;
   }

  
private
void button1_Click(
object sender,
EventArgs e)
   {
      dt.Rows.Add(22,
"vingts-deux");
     
this.userControl11.Test.DefaultCellStyle.BackColor =
Color.Red;
   }
}

Et ça fonctionne sans soucis.

<hr size="2" />VC# forever
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008

Super merci je teste ca des que possible et je te tiens au courant.

duck88
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008

Je suis d'accord pour le control derivé, c'est ce qu'il me faut, mais comment inseré le composant que j'ai modifié dans ma form a partir du .cs que j'ai créé ?

duck88
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Bon finalement tu dérives de DataGridView ou de UserControl?

Visual Studio 2005 insére directement les nouveaux Control dans la bar d'outils, tu n'auras plus qu'à le draguer sur ta form, tout comme tu le fais avec un bouton.
Avec Visual Studio 2003, si mes souvenirs sont bons, faut faire un clique droit sur la barre d'outil, puis "ajouter nouveau" ou qqch comme ça.

<hr size="2" />VC# forever
Messages postés
277
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
4 mai 2008

C'est bel et bien une derivation du datagridview dont j'ai besoin. Merci bcp de votre aide a tous les 2.

duck88