2010-11-23 3 views
4

J'essaie de mettre à jour cet objet DataGridView de sorte que si une valeur == "bob" il y aura un bouton dans une colonne à côté de son nom, sinon je ne veux pas de bouton à apparaître.Comment ajouter des boutons à certaines (pas toutes) des colonnes de mon DataGridView?

DataGridViewTextBoxColumn valueColumn = new DataGridViewTextBoxColumn(); 
DataGridViewButtonColumn buttonColumn = new DataGridViewButtonColumn(); 

buttonColumn.ReadOnly = true; 
buttonColumn.Visible = false; 

this.dgv.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { 
valueColumn, 
buttonColumn, 
}); 

//elsewhere... 

if(value == "bob") 
{ 
    Button button = new Button() 
    { 
     Text = "null", 
    }; 

    index = dgv.Rows.Add(value, button); 
    DataGridViewButtonCell buttonCell = dgv.Rows[index].Cells[2] as DataGridViewButtonCell; 
    buttonCell.Visible = true; 
} 
else 
{ 
    dgv.Rows.Add(value); 
} 

Mais, comme je ne peux pas définir Visible sur une cellule, cela ne fonctionne pas. Y at-il un moyen d'ajouter un bouton à seulement les lignes étaient Value == "bob"?

Répondre

2

Il y a deux possibilités ici, une laide et l'autre de MSDN.

The Ugly: Ajouter un bouton à votre DGV lors de l'exécution

Effectuez les opérations suivantes:
- Ajouter un DataGridViewTextBoxColumn non lié à votre DGV. Notez que c'est la valeur d'index dans votre DGV; C'est ici que vous mettrez votre bouton.
- Utilisez votre événement CellFormatting de DGV comme ceci:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { 
     if (e.ColumnIndex == 0) { // Assumes column 0 has the data that determines if a button should be displayed. 
      if (e.Value.ToString() == "bob") { // Test if a button should be displayed on row. 
       // Create a Button and add it to our DGV. 
       Button cellButton = new Button(); 
       // Do something to identify which row's button was clicked. Here I'm just storing the row index. 
       cellButton.Tag = e.RowIndex; 
       cellButton.Text = "Hello bob"; 
       cellButton.Click += new EventHandler(cellButton_Click); 
       dataGridView1.Controls.Add(cellButton); 
       // Your ugly button column is shown here as having an index value of 3. 
       Rectangle cell = this.dataGridView1.GetCellDisplayRectangle(3, e.RowIndex, true); 
       cellButton.Location = cell.Location; 
      } 
     } 
    } 

Lorsqu'un utilisateur clique sur le bouton de l'événement cellButton_Click se déclenche. Voici un code de test:

void cellButton_Click(object sender, EventArgs e) { 
     Console.WriteLine("Hello from row: {0}", ((Button) sender).Tag); 
    } 

Comme vous pouvez le voir, ce n'est pas très raffiné. Je me suis basé sur un échantillon encore plus laid que j'ai trouvé. Je suis sûr que vous pouvez le modifier pour répondre à vos besoins.

De MSDN: Faites rouler votre propre (étendre) DataGridViewButtonColumn qui affiche un bouton désactivé conditionnellement.

Pour voir cette option How to: Disable Buttons in a Button Column in the Windows Forms DataGridView Control

Bien sûr, cette option ne fait pas supprimer des boutons, uniquement sous certaines conditions désactive eux. Pour votre application cependant, cela pourrait être mieux.

3

Voici un petit hack propre que je l'ai utilisé avant d'y arriver:

Au lieu d'utiliser un DataGridViewButtonColumn, utilisez le DataGridViewTextBoxColumn et ajouter un DataGridViewButtonCell le cas échéant.

par exemple.

private void button1_Click(object sender, EventArgs e) 
    { 
     // Iterate through each of the rows. 
     for (int i = 0; i < dgv.RowCount - 1; i++) 
     { 
      if (dgv.Rows[i].Cells[0].Value.ToString() == "bob") 
      { 
       // Here is the trick. 
       var btnCell = new DataGridViewButtonCell(); 
       dgv.Rows[i].Cells[1] = btnCell; 
      } 
     } 
    } 

Dans l'exemple ci-dessus, j'ai deux DataGridViewTextBoxColumns et itérer chacune des lignes sur un bouton événement click. Je vérifie la première colonne pour voir si elle contient "bob" et si c'est le cas, j'ajoute un bouton dans la colonne à côté de lui. Vous pouvez utiliser cette astuce comme vous le souhaitez (c'est-à-dire, les clics sur les boutons, l'événement RowsAdded, l'événement CellEndEdit, etc.). Expérimenter de différentes manières. J'espère que cela aide quelqu'un!

1

Vous pouvez gérer la peinture cellulaire sur l'événement de peinture cellulaire:

private void dgv_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) 
{ 
    if(e.RowIndex>=0 && e.ColumnIndex == indexOfButtonColumn && value[e.RowIndex] != "bob") 
    { 
      e.Paint(e.ClipBounds, DataGridViewPaintParts.All & ~DataGridViewPaintParts.ContentForeground & ~DataGridViewPaintParts.ContentBackground); 
      e.Handled = true;  
    } 
} 
Questions connexes