2011-06-16 2 views
2

J'ai un DataGridView lié à une base de données SQLite. Maintenant, je souhaite modifier certains champs dans la vue de données.éditions de datagridView

Il existe 4 colonnes TEXT - Horodatage, Message, Type, Hash. Maintenant, je trouve une ligne, je veux faire un clic droit .. Et il devrait avoir l'option - "inclure" .. Donc, quand je clique sur inclure dans le menu contextuel, la colonne Type de ma DGV devrait changer pour "inclure" de tout ce qu'il était auparavant ... (Je ne veux pas qu'il soit activé pour éditer .. Je veux juste qu'il change dans le programme) Comment puis-je obtenir l'index où j'ai cliqué et accéder à cette cellule particulière pour le modifier? ?

Répondre

1

Ce code fait ce que vous voulez:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     BindingList<User> users = new BindingList<User>(); 
     users.Add(new User(){Name = "Fred", Included = "False", Title="Mr"}); 
     users.Add(new User(){Name = "Sue", Included = "False", Title="Dr"}); 
     users.Add(new User(){Name = "Jack", Included = "False", Title="Mr"}); 

     dataGridView1.DataSource = users; 
    } 


    private void dataGridView1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Right) 
     { 
      DataGridView.HitTestInfo hit = dataGridView1.HitTest(e.X, e.Y); 

      if (hit.rowIndex >= 0) 
      { 
       dataGridView1.ClearSelection(); 
       dataGridView1.Rows[hit.RowIndex].Selected = true; 
       contextMenuStrip1.Show(this.dataGridView1, new Point(e.X, e.Y)); 
      } 
     } 
    } 

    private void includeToolStripMenuItem_Click_1(object sender, EventArgs e) 
    { 
     // Included was the name of the column to change in my example code, 
     // you could also use the index of the column if you know it. 
     dataGridView1.SelectedRows[0].Cells["Included"].Value = "Included"; 
    } 
} 

public class User 
{ 
    public string Name { get; set; } 
    public string Title { get; set; } 
    public string Included { get; set; } 
} 

Je ne pouvais pas penser à une meilleure méthode d'informer le menu contextuel quelle ligne a été sélectionné à l'aide effectivement la ligne sélectionnée propriété de DataGridView - vous pouvez également stocker cela dans un champ de niveau de classe, mais je ne pense pas que ce soit aussi bien rangé.

+0

J'ai essayé ceci .. Mais je reçois ceci erreur _Index était hors de portée. Doit être non négatif et inférieur à la taille de la collection. Nom du paramètre: index_ et aussi 'dataGridView1.SelectedRows [0] .Cells ["Included"]. Value = "Included";' qu'est-ce que le "inclus" à l'intérieur des cellules signifie ici? – techmanc

+0

@techmanc l'inclus est le nom de la colonne que vous voulez éditer. Vous pouvez également avoir l'index de cette colonne si vous le connaissez. J'ai également édité le code pour m'occuper de l'erreur d'index - ceci était probablement dû à un clic droit sur l'en-tête. –

+0

Où le code a-t-il été modifié pour gérer l'erreur? Clic droit sur l'en-tête comme dans? Je reçois toujours l'erreur! :( – techmanc

1
private void dataGridView_DoubleClick(object sender, EventArgs e) 
{ 
    var grid = (DataGridView)sender; 
    var point = grid.PointToClient(Cursor.Position); 
    var hit = grid.HitTest(p.X, p.Y);  
    MessageBox.Show(string.Format("{0}/{1}", hit.ColumnIndex, hit.RowIndex)); 
} 

Le code n'est pas compilé testé, mais en théorie, cela devrait faire l'affaire.


dataGridView.Rows[rowIndex].Cells[cellIndex].Value = "something";

+0

Je peux obtenir l'index de l'endroit où j'ai cliqué. Maintenant comment éditer cette cellule de la DGV? – techmanc

+1

J'ai mis à jour ma réponse, mais à l'avenir, vous devriez vous familiariser avec la documentation sur MSDN. Ce n'est pas si dur- http://msdn.microsoft.com/en-US/library/system.windows.forms.datagridviewrow.cells(v=vs.80).aspx –