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éé.
Fichier:Csharp.png
|
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;
}
string clipboardText = Clipboard.GetText();
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];
}
}
var selectedCell = dgv.SelectedCells[0];
for (int i = 0; i < clipboardMatrix.Length; i++)
{
int hiddenColumnOffset = 0;
for (int j = 0; j < clipboardMatrix[i].Length; j++)
{
var currentCell = dgv[selectedCell.ColumnIndex + j + hiddenColumnOffset, selectedCell.RowIndex + i];
if (j == 0 && !currentCell.Visible && dgv.SelectedRows.Count > 0)
{
continue;
}
while (!currentCell.Visible)
{
hiddenColumnOffset++;
currentCell = dgv[selectedCell.ColumnIndex + j + hiddenColumnOffset, selectedCell.RowIndex + i];
}
try
{
currentCell.Value = Convert.ChangeType(clipboardMatrix[i][j], currentCell.ValueType);
}
catch { }
}
}
}
|
Gestion des exceptions
Fichier:Csharp.png
|
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";
e.ThrowException = false;
}
private void dgv_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
dgvOverrode.Rows[e.RowIndex].ErrorText = String.Empty;
}
|
Liaison avec une DataTable
La DataTable et la DataGridView sont en permanence synchronisés.
Fichier:Csharp.png
|
var dt = new DataTable();
dt.Columns.Add("Colonne");
var dgv = new DataGridView();
dgv.DataSource = dt;
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:
Fichier:Csharp.png
|
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.
Fichier:Csharp.png
|
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
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