J'ai quelques colonnes dans mon DataGridView et il y a des données dans mes lignes. J'ai vu peu de solutions ici, mais je ne peux pas les combiner!
Un simple moyen de cliquer avec le bouton droit sur une ligne permet de sélectionner la ligne entière et d'afficher un menu avec une option permettant de supprimer la ligne. Lorsque l'option sélectionnée sera sélectionnée, elle supprimera la ligne.
J'ai fait quelques tentatives mais aucune ne fonctionne et ça a l'air sale. Que devrais-je faire?
Je l'ai finalement résolu:
Dans Visual Studio, créez un ContextMenuStrip avec un élément appelé "DeleteRow".
Ensuite, au niveau du DataGridView, le ContextMenuStrip
L'utilisation du code ci-dessous m'a aidé à le faire fonctionner.
this.MyDataGridView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MyDataGridView_MouseDown);
this.DeleteRow.Click += new System.EventHandler(this.DeleteRow_Click);
Voici la partie cool
private void MyDataGridView_MouseDown(object sender, MouseEventArgs e)
{
if(e.Button == MouseButtons.Right)
{
var hti = MyDataGridView.HitTest(e.X, e.Y);
MyDataGridView.ClearSelection();
MyDataGridView.Rows[hti.RowIndex].Selected = true;
}
}
private void DeleteRow_Click(object sender, EventArgs e)
{
Int32 rowToDelete = MyDataGridView.Rows.GetFirstRow(DataGridViewElementStates.Selected);
MyDataGridView.Rows.RemoveAt(rowToDelete);
MyDataGridView.ClearSelection();
}
Pour compléter cette question, il est préférable d’utiliser un événement Grid plutôt que de la souris.
Commencez par définir vos propriétés de grille de données:
SelectionMode to FullRowSelect Et RowTemplate/ContextMenuStrip dans un menu contextuel.
Créez l'événement CellMouseDown: -
private void myDatagridView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
int rowSelected = e.RowIndex;
if (e.RowIndex != -1)
{
this.myDatagridView.ClearSelection();
this.myDatagridView.Rows[rowSelected].Selected = true;
}
// you now have the selected row with the context menu showing for the user to delete etc.
}
}
private void dgvOferty_CellContextMenuStripNeeded(object sender, DataGridViewCellContextMenuStripNeededEventArgs e)
{
dgvOferty.ClearSelection();
int rowSelected = e.RowIndex;
if (e.RowIndex != -1)
{
this.dgvOferty.Rows[rowSelected].Selected = true;
}
e.ContextMenuStrip = cmstrip;
}
TADA: D. La période la plus simple. Pour les cellules personnalisées, il suffit de modifier un peu.
Il est beaucoup plus facile d'ajouter uniquement l'événement pour mousedown:
private void MyDataGridView_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
var hti = MyDataGridView.HitTest(e.X, e.Y);
MyDataGridView.Rows[hti.RowIndex].Selected = true;
MyDataGridView.Rows.RemoveAt(rowToDelete);
MyDataGridView.ClearSelection();
}
}
C'est plus facile. Bien sûr, vous devez initier votre événement de souris comme déjà mentionné avec:
this.MyDataGridView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MyDataGridView_MouseDown);
dans votre constructeur.
Toutes les réponses à cette question sont basées sur un événement de clic de souris. Vous pouvez également affecter une ContenxtMenuStrip
à votre DataGridview
et vérifier si une ligne est sélectionnée lorsque l'utilisateur RightMouseButtons sur la DataGridView
et décider si vous souhaitez afficher la ContenxtMenuStrip
. Vous pouvez le faire en définissant la valeur CancelEventArgs.Cancel
dans l'événement Opening de la ContextMenuStrip
private void MyContextMenuStrip_Opening(object sender, CancelEventArgs e)
{
//Only show ContextMenuStrip when there is 1 row selected.
if (MyDataGridView.SelectedRows.Count != 1) e.Cancel = true;
}
Mais si vous avez plusieurs bandes de menu contextuel, chacune contenant différentes options, en fonction de la sélection, je choisirais moi aussi une approche clic-souris.
base sur la réponse @ Data-Base cela ne fonctionnera pas tant que le mode de sélection FullRow n’aura pas
MyDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
mais si vous devez le faire fonctionner en mode CellSelect
MyDataGridView.SelectionMode = DataGridViewSelectionMode.CellSelect;
// for cell selection
private void MyDataGridView_MouseDown(object sender, MouseEventArgs e)
{
if(e.Button == MouseButtons.Right)
{
var hit = MyDataGridView.HitTest(e.X, e.Y);
MyDataGridView.ClearSelection();
// cell selection
MyDataGridView[hit.ColumnIndex,hit.RowIndex].Selected = true;
}
}
private void DeleteRow_Click(object sender, EventArgs e)
{
int rowToDelete = MyDataGridView.Rows.GetFirstRow(DataGridViewElementStates.Selected);
MyDataGridView.Rows.RemoveAt(rowToDelete);
MyDataGridView.ClearSelection();
}
private void MyDataGridView_MouseDown(object sender, MouseEventArgs e)
{
if(e.Button == MouseButtons.Right)
{
MyDataGridView.ClearSelection();
MyDataGridView.Rows[e.RowIndex].Selected = true;
}
}
private void DeleteRow_Click(object sender, EventArgs e)
{
Int32 rowToDelete = MyrDataGridView.Rows.GetFirstRow(DataGridViewElementStates.Selected);
MyDataGridView.Rows.RemoveAt(rowToDelete);
MyDataGridView.ClearSelection();
}
J'ai une nouvelle solution de contournement pour arriver au même résultat, mais avec moins de code . Pour Winforms ... Cet exemple est en portugais Suivi étape par étape
vous n’oubliez pas d’activer la suppression sur gridview, non?!
Voir ici cela peut être fait en utilisant la propriété DataGridView
RowTemplate
.
Remarque: Ce code n'a pas été testé, mais j'ai déjà utilisé cette méthode auparavant.
// Create DataGridView
DataGridView gridView = new DataGridView();
gridView.AutoGenerateColumns = false;
gridView.Columns.Add("Col", "Col");
// Create ContextMenu and set event
ContextMenuStrip cMenu = new ContextMenuStrip();
ToolStripItem mItem = cMenu.Items.Add("Delete");
mItem.Click += (o, e) => { /* Do Something */ };
// This makes all rows added to the datagridview use the same context menu
DataGridViewRow defaultRow = new DataGridViewRow();
defaultRow.ContextMenuStrip = cMenu;
Et voilà, aussi simple que cela!
Vous pouvez également simplifier un peu les choses en utilisant ce qui suit dans le code de l'événement:
private void MyDataGridView_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
rowToDelete = e.RowIndex;
MyDataGridView.Rows.RemoveAt(rowToDelete);
MyDataGridView.ClearSelection();
}
}