web-dev-qa-db-fra.com

Ajouter par programme une nouvelle colonne à DataGridView

J'ai un DataGridView lié à un DataTable. Le DataTable est rempli à partir d'une requête de base de données. La table contient une colonne nommée BestBefore. BestBefore est une date au format chaîne (SQLite n’a pas de types de date).

Je voudrais ajouter par programme une nouvelle colonne à la DataGridView appelée Status. Si BestBefore est inférieur à la date actuelle, la valeur Status doit être définie sur OK, sinon la valeur Status doit être définie sur NOT OK.

Je suis très nouveau dans Winforms, donc quelques exemples de code seraient grandement appréciés.

PDATE:

Je pense que DataColumn.Expression convient pour effectuer des calculs simples, par exemple en multipliant la valeur entière d'une colonne par une autre valeur, mais qu'en est-il de ce que je dois faire? Autrement dit, calculez la différence entre maintenant et la date (chaîne mise en forme) dans la colonne BestBefore pour déterminer quelle valeur attribuer à la nouvelle colonne de statut. Exemple de code serait apprécié.

38
halfpint

Ajoutez une nouvelle colonne à la propriété DataTable et utilisez la propriété column Expression pour définir votre expression Status.

Ici vous pouvez trouver un bon exemple: DataColumn.Expression Propriété

Expressions DataTable et DataColumn dans ADO.NET - Colonnes calculées

[~ # ~] met à jour [~ # ~]

Exemple de code:

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("colBestBefore", typeof(DateTime)));
dt.Columns.Add(new DataColumn("colStatus", typeof(string)));

dt.Columns["colStatus"].Expression = String.Format("IIF(colBestBefore < #{0}#, 'Ok','Not ok')", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

dt.Rows.Add(DateTime.Now.AddDays(-1));
dt.Rows.Add(DateTime.Now.AddDays(1));
dt.Rows.Add(DateTime.Now.AddDays(2));
dt.Rows.Add(DateTime.Now.AddDays(-2));

demoGridView.DataSource = dt;

UPDATE # 2

dt.Columns["colStatus"].Expression = String.Format("IIF(CONVERT(colBestBefore, 'System.DateTime') < #{0}#, 'Ok','Not ok')", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
19
HABJAN

Rester simple

dataGridView1.Columns.Add("newColumnName", "Column Name in Text");

Pour ajouter des lignes

dataGridView1.Rows.Add("Value for column#1"); // [,"column 2",...]
36
Rusty

Voici un exemple de méthode qui ajoute deux colonnes supplémentaires par programme à la vue en grille:

    private void AddColumnsProgrammatically()
    {
        // I created these columns at function scope but if you want to access 
        // easily from other parts of your class, just move them to class scope.
        // E.g. Declare them outside of the function...
        var col3 = new DataGridViewTextBoxColumn();
        var col4 = new DataGridViewCheckBoxColumn();

        col3.HeaderText = "Column3";
        col3.Name = "Column3";

        col4.HeaderText = "Column4";
        col4.Name = "Column4";

        dataGridView1.Columns.AddRange(new DataGridViewColumn[] {col3,col4});
    }

Un excellent moyen de savoir comment effectuer ce type de processus consiste à créer un formulaire, à ajouter un contrôle de vue grille et à ajouter des colonnes. (Ce processus fonctionnera en réalité pour TOUT type de contrôle de formulaire. Toutes les instanciations et toutes les initialisations se produisent dans Designer.) Ensuite, examinez le fichier Designer.cs du formulaire pour voir comment se déroule la construction. (Visual Studio fait tout par programme mais le cache dans le Concepteur de fiches.)

Pour cet exemple, j'ai créé deux colonnes pour la vue nommée Column1 et Column2, puis j'ai recherché Form1.Designer.cs pour Column1 afin de voir où il était référencé. Les informations suivantes sont ce que j'ai glané et copié et modifié pour créer deux autres colonnes de manière dynamique:

// Note that this info scattered throughout the designer but can easily collected.

        System.Windows.Forms.DataGridViewTextBoxColumn Column1;
        System.Windows.Forms.DataGridViewCheckBoxColumn Column2;

        this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
        this.Column2 = new System.Windows.Forms.DataGridViewCheckBoxColumn();

        this.dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
        this.Column1,
        this.Column2});

        this.Column1.HeaderText = "Column1";
        this.Column1.Name = "Column1";

        this.Column2.HeaderText = "Column2";
        this.Column2.Name = "Column2";
13
Paul Sasik