« DataGridView » : différence entre les versions
De Banane Atomic
Aller à la navigationAller à la recherche
Aucun résumé des modifications |
Aucun résumé des modifications |
||
Ligne 1 : | Ligne 1 : | ||
=Coller= | [[Category:CSharp]] | ||
*Ajouter un ContextMenuStrip à la Form. | = Coller = | ||
*Ajouter un ToolStripMenuItem au ContextMenuStrip. Renseigner la propriété ShortcutKeys. | * Ajouter un ContextMenuStrip à la Form. | ||
*Associer la propriété ContextMenuStrip de la DataGridView au ContextMenuStrip précédemment créé. | * Ajouter un ToolStripMenuItem au ContextMenuStrip. Renseigner la propriété ShortcutKeys. | ||
* Associer la propriété ContextMenuStrip de la DataGridView au ContextMenuStrip précédemment créé. | |||
<kode lang="csharp"> | |||
< | |||
// Méthode associée au clique sur le ToolStripMenuItem | // Méthode associée au clique sur le ToolStripMenuItem | ||
private void tsmiPaste_Click(object sender, EventArgs e) | private void tsmiPaste_Click(object sender, EventArgs e) | ||
Ligne 62 : | Ligne 61 : | ||
} | } | ||
} | } | ||
</ | </kode> | ||
=Gestion des exceptions= | = Gestion des exceptions = | ||
<kode lang="csharp"> | |||
< | |||
// Capture toutes les exceptions générée par la DataGridView | // Capture toutes les exceptions générée par la DataGridView | ||
private void dgv_DataError(object sender, DataGridViewDataErrorEventArgs e) | private void dgv_DataError(object sender, DataGridViewDataErrorEventArgs e) | ||
Ligne 87 : | Ligne 82 : | ||
//dgvOverrode.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = String.Empty; | //dgvOverrode.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = String.Empty; | ||
} | } | ||
</ | </kode> | ||
=Liaison avec une DataTable= | = Liaison avec une DataTable = | ||
La DataTable et la DataGridView sont en permanence synchronisés. | La DataTable et la DataGridView sont en permanence synchronisés. | ||
<kode lang="csharp"> | |||
< | |||
var dt = new DataTable(); | var dt = new DataTable(); | ||
dt.Columns.Add("Colonne"); | dt.Columns.Add("Colonne"); | ||
Ligne 104 : | Ligne 96 : | ||
// l'ajout de ligne par le code doit se faire sur la DataTable et non sur la DataGridView | // l'ajout de ligne par le code doit se faire sur la DataTable et non sur la DataGridView | ||
dt.Rows.Add("1"); | dt.Rows.Add("1"); | ||
</ | </kode> | ||
=EditMode= | = EditMode = | ||
<u>EditOnKeyStrokeOrF2 :</u> Mode par défaut, il faut double-cliquer sur une cellule pour l’éditer.<br/> | <u>EditOnKeyStrokeOrF2 :</u> Mode par défaut, il faut double-cliquer sur une cellule pour l’éditer.<br/> | ||
<u>EditOnEnter :</u> Dans ce mode il suffit de cliquer sur la cellule pour l’éditer. Par contre un clique sur le header d’une ligne édite la première cellule, ce qui empêche de supprimer la ligne.<br/> | <u>EditOnEnter :</u> Dans ce mode il suffit de cliquer sur la cellule pour l’éditer. Par contre un clique sur le header d’une ligne édite la première cellule, ce qui empêche de supprimer la ligne.<br/> | ||
EditOnEnter et suppression de ligne: | EditOnEnter et suppression de ligne: | ||
<kode lang="csharp"> | |||
< | |||
private void DGV_MouseClick(object sender, MouseEventArgs e) | private void DGV_MouseClick(object sender, MouseEventArgs e) | ||
{ | { | ||
Ligne 128 : | Ligne 117 : | ||
} | } | ||
} | } | ||
</ | </kode> | ||
=Tester les données des cellules dès leurs saisies= | = Tester les données des cellules dès leurs saisies = | ||
La validation bloque l’utilisateur tant qu’il n’a pas saisie de valeur valide et affiche un message d’erreur. | La validation bloque l’utilisateur tant qu’il n’a pas saisie de valeur valide et affiche un message d’erreur. | ||
<kode lang="csharp"> | |||
< | |||
private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) | private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) | ||
{ | { | ||
Ligne 154 : | Ligne 140 : | ||
} | } | ||
</ | </kode> | ||
=Tri en fonction d’une colonne= | = Tri en fonction d’une colonne = | ||
<kode lang="csharp"> | |||
< | |||
dgv.Sort(dgv.Columns[1], ListSortDirection.Descending); | dgv.Sort(dgv.Columns[1], ListSortDirection.Descending); | ||
</ | </kode> | ||
=Propriété intéressantes de l'interface= | = Propriété intéressantes de l'interface = | ||
*Alignement : | * Alignement : | ||
**DefaultCellStyle.Alignement = MiddleCenter | ** DefaultCellStyle.Alignement = MiddleCenter | ||
**ColumnHeadersDefaultCellStyle = MiddleCenter | ** ColumnHeadersDefaultCellStyle = MiddleCenter | ||
*Taille des colonnes : AutoSizeColumnsMode = DisplayCells | * Taille des colonnes : AutoSizeColumnsMode = DisplayCells | ||
*Cacher la première colonne : RowHeadersVisible = false | * Cacher la première colonne : RowHeadersVisible = false | ||
*Empêcher la redimension : AllowUserToResize… = false | * Empêcher la redimension : AllowUserToResize… = false | ||
Dernière version du 12 avril 2020 à 12:48
Coller
- Ajouter un ContextMenuStrip à la Form.
- Ajouter un ToolStripMenuItem au ContextMenuStrip. Renseigner la propriété ShortcutKeys.
- Associer la propriété ContextMenuStrip de la DataGridView au ContextMenuStrip précédemment créé.
// Méthode associée au clique sur le ToolStripMenuItem private void tsmiPaste_Click(object sender, EventArgs e) { // si aucune cellule n'est sélectionnée on ne colle pas, car on ne sait pas ou commencer le collage. if (dgv.SelectedCells == null || dgv.SelectedCells.Count < 1) { return; } // récupération du contenu du presse papier string clipboardText = Clipboard.GetText(); // séparation par lignes et suppression des lignes vides string[] clipboardLines = clipboardText.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); string[][] clipboardMatrix = new string[clipboardLines.Length][]; for (int i = 0; i < clipboardLines.Length; i++) { var elements = clipboardLines[i].Split('\t'); clipboardMatrix[i] = new string[elements.Length]; for (int j = 0; j < elements.Length; j++) { clipboardMatrix[i][j] = elements[j]; } } // paste from the first selected cell var selectedCell = dgv.SelectedCells[0]; for (int i = 0; i < clipboardMatrix.Length; i++) // i: lines { int hiddenColumnOffset = 0; // for hidden columns for (int j = 0; j < clipboardMatrix[i].Length; j++) // j: columns { var currentCell = dgv[selectedCell.ColumnIndex + j + hiddenColumnOffset, selectedCell.RowIndex + i]; // if you selected an entire row, don't treat the row header if (j == 0 && !currentCell.Visible && dgv.SelectedRows.Count > 0) { continue; } while (!currentCell.Visible) // for hidden columns { hiddenColumnOffset++; currentCell = dgv[selectedCell.ColumnIndex + j + hiddenColumnOffset, selectedCell.RowIndex + i]; } try { currentCell.Value = Convert.ChangeType(clipboardMatrix[i][j], currentCell.ValueType); } catch { } } } } |
Gestion des exceptions
// Capture toutes les exceptions générée par la DataGridView private void dgv_DataError(object sender, DataGridViewDataErrorEventArgs e) { // Affiche une icône dans l'en-tête de la ligne avec le message en ToolTip. dgvOverrode.Rows[e.RowIndex].ErrorText = "wrong value"; //dgvOverrode.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = "wrong value"; // annule l'exception e.ThrowException = false; } // Efface les messages d'erreur une fois qu'une bonne valeur est saisie private void dgv_CellEndEdit(object sender, DataGridViewCellEventArgs e) { dgvOverrode.Rows[e.RowIndex].ErrorText = String.Empty; //dgvOverrode.Rows[e.RowIndex].Cells[e.ColumnIndex].ErrorText = String.Empty; } |
Liaison avec une DataTable
La DataTable et la DataGridView sont en permanence synchronisés.
var dt = new DataTable(); dt.Columns.Add("Colonne"); var dgv = new DataGridView(); dgv.DataSource = dt; // l'ajout de ligne par le code doit se faire sur la DataTable et non sur la DataGridView dt.Rows.Add("1"); |
EditMode
EditOnKeyStrokeOrF2 : Mode par défaut, il faut double-cliquer sur une cellule pour l’éditer.
EditOnEnter : Dans ce mode il suffit de cliquer sur la cellule pour l’éditer. Par contre un clique sur le header d’une ligne édite la première cellule, ce qui empêche de supprimer la ligne.
EditOnEnter et suppression de ligne:
private void DGV_MouseClick(object sender, MouseEventArgs e) { DataGridView.HitTestInfo hitInfo = this.DGV.HitTest(e.X, e.Y); if (hitInfo.Type == DataGridViewHitTestType.RowHeader) { this.DGV.EditMode = DataGridViewEditMode.EditOnKeystrokeOrF2; this.DGV.EndEdit(); } else { this.DGV.EditMode = DataGridViewEditMode.EditOnEnter; } } |
Tester les données des cellules dès leurs saisies
La validation bloque l’utilisateur tant qu’il n’a pas saisie de valeur valide et affiche un message d’erreur.
private void dataGridView_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { DataGridView dgv = (DataGridView)sender; if (dgv.Columns[e.ColumnIndex] == "ColumnName") { if (string.IsNullOrEmpty(e.FormattedValue.ToString()) { dgv.Rows[e.RowIndex].ErrorText = "Cell must not be empty"; e.Cancel = true; } } } private void cduDataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e) { ((DataGridView)sender).Rows[e.RowIndex].ErrorText = String.Empty; } |
Tri en fonction d’une colonne
dgv.Sort(dgv.Columns[1], ListSortDirection.Descending); |
Propriété intéressantes de l'interface
- Alignement :
- DefaultCellStyle.Alignement = MiddleCenter
- ColumnHeadersDefaultCellStyle = MiddleCenter
- Taille des colonnes : AutoSizeColumnsMode = DisplayCells
- Cacher la première colonne : RowHeadersVisible = false
- Empêcher la redimension : AllowUserToResize… = false