Remplir certaines colonnes datagridview via requete
Bonjour à tous,
J'ai dérivé un datagridview pour créer dynamiquement mon propre objet _dgv_Pays , je recherche comment remplir mes colonnes. Je passe par un bindingsource et un datatable:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| public frm_Pays()
{
InitializeComponent();
// Création d'un DATATABLE
// --------------------------
DataTable _dt = new DataTable("dtTableNom");
_dt.Columns.Add("Identifiant",typeof(Int32));
_dt.Columns.Add("Désignation du pays", typeof(string));
_dt.Columns[0].Caption = _dt.Columns[0].ColumnName;
_dt.Columns[1].Caption = "Désignation pays";
// Chargement de la table par retour d'une requete SQL (format de retour id, Libellé pays)
_dt = Pays.PaysListe();
// Création du bindingSource
BindingSource _bs = new BindingSource();
_bs.DataSource = _dt;
// Affectation propriètes du datagridview _dgv_Pays instancié précédement
// ---------------------------------------------------------------------------
_dgv_Pays.Top = this.Top + 30;
_dgv_Pays.Left = this.Left + 5;
_dgv_Pays.Visible = true;
_dgv_Pays.AutoGenerateColumns = false; // Je génére mes propres colonnes
_dgv_Pays.ColumnHeadersVisible = true;
_dgv_Pays.Columns.Add(new DataGridViewTextBoxColumn()); // 1er colonne crée
_dgv_Pays.Columns.Add("toto", "Titre"); //2ème colonne crée
_dgv_Pays.DataSource = _bs; // Affecte le data source
Controls.Add(_dgv_Pays);
//_dgv_Pays.Columns[1].HeaderText = _dt.Columns[1].Caption;
//_dgv_Pays.Columns[].HeaderText=_dt.Columns[].Caption;
//_dgv_Pays.Columns[0].Visible=false;
//_dgv_Pays.Columns[1].Visible=true;
} |
Et maintenant comment faire pour que ma colonne 1 contient le champ de retour 1 de ma requete et la colonne 2 le champ de retour 2 de ma requete.... Je veux le faire dynamiquement, car parfois, j'aurais 5 champs en retour et par forcement dans le bonne ordre de visualisation (ex: je récupère les champs 1,2,3,4 et 5, et je devrais afficher le champs 3, 1 et 5 avec le champ 2 non visible mais utilisable et le champ 4 non visible et sans interet)...
Des idées pour m'aider dans cette aventure ?
Une solution fonctionnelle :
Ci-dessous un exemple de code pour personnaliser des colonnes définies auparavant dans un DataGridView
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
public void FillDataGridResult()
{
dgvResult.DataSource = DataSetContenantDataTable;
dgvResult.DataMember = "NomDataTable";
DataGridViewTextBoxColumn dgvtbc = (DataGridViewTextBoxColumn)dgvResult.Columns["Description"];
dgvtbc.Name = dgvtbc.DataPropertyName;
dgvtbc.HeaderText = "Description";
dgvtbc.Width = 400;
dgvtbc.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft;
dgvtbc.DefaultCellStyle.WrapMode = DataGridViewTriState.False;
dgvtbc.DefaultCellStyle.NullValue = string.Empty;
dgvtbc = (DataGridViewTextBoxColumn)dgvResult.Columns["Nombre"];
dgvtbc.Name = dgvtbc.DataPropertyName;
dgvtbc.HeaderText = "Nombre";
dgvtbc.Width = 100;
dgvtbc.DefaultCellStyle.Format = "#####0";
dgvtbc.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
dgvtbc.DefaultCellStyle.WrapMode = DataGridViewTriState.False;
dgvtbc.DefaultCellStyle.NullValue = string.Empty;
dgvtbc = (DataGridViewTextBoxColumn)dgvResult.Columns["Index"];
dgvtbc.Name = dgvtbc.DataPropertyName;
dgvtbc.HeaderText = "Id";
dgvtbc.Width = 0;
dgvtbc.Visible = false;
} |
Pour l'ordre des colonnes, tu peux par exemple faire un DataGridView.Columns.Clear() et ensuite les redéfinir dans l'ordre de ton choix en utilisant un code similaire :
Code:
1 2 3 4 5 6 7 8
|
dgvtbc = new DataGridViewTextBoxColumn();
dgvtbc.DataPropertyName = "Description";
dgvtbc.Name = dgvtbc.DataPropertyName;
dgvtbc.HeaderText = "Description";
dgvtbc.Width = 400;
dgvResult.Columns.Add(dgvtbc); |
Une autre méthode serait d'utiliser les fonctions Columns.RemoveAt() et Columns.Insert(), mais je n'ai jamais testé personnellement.