J'ai une petite application en c #, elle a un DataGridView qui se remplit en utilisant:
grid.DataSource = MyDatasource array;
MyClass détient la structure des colonnes, elle ressemble à ceci:
class MyDatasource
{
private string column1;
private string column2;
public MyDatasource(string arg1, string arg2)
{
this.column1 = arg1;
this.column2 = arg2;
}
public string column1
{
get
{
return this.column1;
}
set
{
this.column1 = value;
}
}
public string column2
{
get
{
return this.column2;
}
set
{
this.column1 = value;
}
}
}
Tout fonctionne bien et le DataGridView est rempli avec les données correctes, mais maintenant je veux masquer la colonne2. J'ai essayé d'ajouter [Browsable(false)]
au-dessus de la déclaration de colonne, cela la cachera, mais j'ai également besoin d'accéder à la valeur de la colonne à partir du code, et lorsque j'utilise [Browsable(false)]
et d'essayer de lire le contenu, agit comme si la colonne n'existe pas. Si je ne l'utilise pas, je peux lire la colonne sans problème mais elle est visible dans DataGridView.
Comment pourrais-je masquer la colonne tout en étant capable de lire son contenu à partir du code?
Dans certains cas, il peut être judicieux d'ajouter d'abord la colonne à DataGridView, puis de la masquer.
J'ai par exemple une classe qui a un proxy NHibernate pour une propriété Image pour les logos d'entreprise. Si j'accédais à cette propriété (par exemple en appelant sa méthode ToString pour montrer que dans un DataGridView), il téléchargerait l'image depuis le serveur SQL. Si j'avais une liste d'objets de la société et que j'utilisais cela comme source de données du DataGridView comme ça, alors (je soupçonne) il téléchargerait TOUS les logos AVANT de pouvoir masquer la colonne.
Pour éviter cela, j'ai utilisé l'attribut personnalisé
[System.ComponentModel.Browsable(false)]
sur la propriété image, de sorte que DataGridView ignore la propriété (ne crée pas la colonne et n'appelle pas les méthodes ToString).
public class Company
{
...
[System.ComponentModel.Browsable(false)]
virtual public MyImageClass Logo { get; set;}
Vous devez masquer la colonne dans le contrôle d'affichage de la grille plutôt que dans la source de données. En le cachant à la source de données, il ne sera pas rendu du tout à la vue de la grille, vous ne pourrez donc pas accéder à la valeur dans la vue de la grille. En procédant comme vous le suggérez, vous devrez accéder à la valeur de la colonne via la source de données, par opposition à la vue de la grille.
Pour masquer la colonne sur le contrôle d'affichage de la grille, vous pouvez utiliser un code comme celui-ci:
dataGridView1.Columns[0].Visible = false;
Pour accéder à la colonne à partir de la source de données, vous pouvez essayer quelque chose comme ceci:
object colValue = ((DataTable)dataGridView.DataSource).Rows[dataSetIndex]["ColumnName"];
J'ai remarqué que s'il est utilisé de façon progressive, il devient incomplet (le formulaire entier ne "peint" rien du tout) s'il est utilisé avant panel1.Controls.Add(dataGridView);
puis dataGridView.Columns["ID"].Visible = false;
cassera tout le formulaire et le rendra vierge, donc pour contourner ce paramètre AFTER EG:
panel1.Controls.Add(dataGridView);
dataGridView.Columns["ID"].Visible = false;
//works
dataGridView.Columns["ID"].Visible = false;
panel1.Controls.Add(dataGridView);
//fails miserably
Je ne suis pas sûr qu'il soit trop tard, mais le problème est que vous ne pouvez pas définir les colonnes en mode conception si vous effectuez une liaison au moment de l'exécution. faites-le de façon pragmatique
ex..
if (dt.Rows.Count > 0)
{
dataGridViewProjects.DataSource = dt;
dataGridViewProjects.Columns["Title"].Width = 300;
dataGridViewProjects.Columns["ID"].Visible = false;
}
Définissez la propriété Visible
de cette colonne particulière = false
dataGridView[ColumnName or Index].Visible = false;
Modifier désolé manqué la propriété Columns
dataGridView.Columns[ColumnName or Index].Visible = false;
J'ai eu le même problème
Voici la solution qui pourrait vous convenir. Ça a marché pour moi
GridView1.DataBind();
if (GridView1.Columns.Count > 0)
GridView1.Columns[0].Visible = false;
else
{
GridView1.HeaderRow.Cells[0].Visible = false;
foreach (GridViewRow gvr in GridView1.Rows)
{
gvr.Cells[0].Visible = false;
}
}
Réglez simplement DataGridView.AutoGenerateColumns = false
;
Vous devez cliquer sur la flèche dans le coin supérieur droit (dans datagridview
) pour ajouter des colonnes, et dans DataPropertyName
vous devez mettre un nom de votre propriété dans votre classe.
Ensuite, après avoir défini vos colonnes dans datagridview
, vous pouvez définir datagridview.datasource = myClassViewModel
.