2010-12-07 3 views
2

J'utilise une DGV dans une application winforms. Je voulais changer un statut de ligne de New (IsNewRow) à édité. Chaque fois que nous commençons à entrer des valeurs dans la dernière ligne de la DGV, il crée une autre ligne en dessous de la ligne d'édition en rendant la propriété IsNewRow de la ligne en cours à false.Modification de l'état IsNewRow à false dans DataGridView ou Simulation de la frappe sur une cellule

Dans mon exigence, lorsque l'utilisateur est dans la dernière rangée et si F6 est pressé puis je copie quelques valeurs de cellule de la rangée ci-dessus à la ligne actuelle. À ce moment, la ligne en cours est toujours dans l'état Nouvelle ligne (IsNewRow = true). Une fois que je copie des valeurs dans la ligne en cours à partir de la ligne ci-dessus, je souhaite modifier l'état de la ligne en cours afin que DGV crée une autre ligne sous la ligne actuelle en tant que nouvelle ligne. Vous ne savez pas quel événement fait DGV pour créer une nouvelle ligne, alors s'il vous plaît aidez-moi, dans cela.

Y at-il de toute façon que je peux changer l'état de la ligne en cours? La propriété IsNewRow est en lecture seule, donc je ne peux pas la modifier.

Mise à jour: J'ai trouvé un moyen de définir l'état actuel de la ligne (IsNewRow = false). Utilisez la méthode suivante: MyGridView.NotifyCurrentCellDirty(true);. Au moins, je voudrais simuler la frappe, de sorte que je trompe DGV pour créer une autre ligne en faisant cette ligne éditée. Quelqu'un peut-il me dire comment faire cela à DGV?

Cette DGV n'est pas databound.

Voici le code utilisé pour copier les valeurs de ligne au-dessus à la ligne courante:

switch (e.KeyData) 
    { 
    case Keys.F6: //Copy the row above. 
     if (MyGridView.CurrentRow != null && MyGridView.CurrentRow.Index > 0) 
     { 
     MyGridView.CurrentRow.Cells[CustomColumn.Index].Value 
      = MyGridView.Rows[rowIndex - 1].Cells[Customer.Index].Value; 

     MyGridView.CurrentRow.Cells[DateColumn.Index].Value 
      = MyGridView.Rows[rowIndex - 1].Cells[DateColumn.Index].Value; 

     MyGridView.CurrentRow.Cells[RefColumn.Index].Value 
      = MyGridView.Rows[rowIndex - 1].Cells[RefColumn.Index].Value; 
     } 
    } 

Répondre

1

Je ne sais pas comment manipuler l'état de la ligne pour ce faire, mais vous pouvez ajouter une nouvelle ligne , puis définissez les valeurs de ligne en cours. J'ai trouvé que lorsque vous ajoutez une nouvelle ligne, elle apparaît au-dessus de la ligne actuellement nouvelle, donc si vous ne réinitialisez pas la ligne en cours, vous obtenez une ligne vide dans la grille.

Essayez ce qui suit et voyez si elle fait ce que vous voulez. J'ai également changé le test d'index de ligne afin qu'il ne copie des valeurs que si l'utilisateur est sur la nouvelle ligne.

switch (e.KeyData) 
    { 
    case Keys.F6: //Copy the row above. 
     if (MyGridView.NewRowIndex > 0 && MyGridView.NewRowIndex == rowIndex) 
     { 
     int colIndex = MyGridView.CurrentCell.ColumnIndex; 

     MyGridView.Rows.Add(); 
     MyGridView.CurrentCell = MyGridView.Rows[rowIndex].Cells[colIndex]; 

     MyGridView.CurrentRow.Cells[CustomColumn.Index].Value 
      = MyGridView.Rows[rowIndex - 1].Cells[Customer.Index].Value; 

     MyGridView.CurrentRow.Cells[DateColumn.Index].Value 
      = MyGridView.Rows[rowIndex - 1].Cells[DateColumn.Index].Value; 

     MyGridView.CurrentRow.Cells[RefColumn.Index].Value 
      = MyGridView.Rows[rowIndex - 1].Cells[RefColumn.Index].Value; 
     } 
    } 
+0

C'était génial et simple. Je ne sais pas pourquoi j'ai manqué une telle fonction Rows.Add() simple. Vous avez donné une solution très simple et parfaite. Merci mec, ça a parfaitement fonctionné. Je luttais avec le faire depuis 4 heures. – JPReddy

+0

@JPReddy, super, content de pouvoir aider. –

Questions connexes