2010-11-23 5 views

Antwort

2

Hier gibt es zwei Möglichkeiten, eine hässliche und eine von MSDN.

Das hässliche: eine Schaltfläche, um Ihre DGV hinzufügen zur Laufzeit

Sie wie folgt:
- ein ungebundenes DataGridViewTextBoxColumn auf Ihre DGV hinzufügen. Beachten Sie den Indexwert in Ihrem DGV. Hier setzen Sie Ihren Knopf.
- Ihr DGV des Cellformatting-Ereignis verwenden wie so:

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; 
      } 
     } 
    } 

Wenn ein Benutzer auf die Schaltfläche Ereignis des cellButton_Click klickt ausgelöst. Hier ist ein Testcode:

Wie Sie sehen können, ist dies nicht sehr raffiniert. Ich basierte auf einer noch hässlicheren Probe, die ich fand. Ich bin sicher, dass Sie es an Ihre Bedürfnisse anpassen können.

Von MSDN: Roll eigenen (erweitern) DataGridViewButtonColumn, die eine deaktivierte Schaltfläche bedingt anzeigt.

Für diese Option sehen How to: Disable Buttons in a Button Column in the Windows Forms DataGridView Control

Natürlich ist diese Option alle Tasten nicht wirklich entfernen, deaktiviert nur bedingt sie. Für Ihre Anwendung könnte dies jedoch besser sein.

3

Hier ist ein netter kleiner Hack, die ich vorher benutzt habe, dies zu erreichen:

Statt eine DataGridViewButtonColumn verwenden, verwenden Sie die DataGridViewTextBoxColumn und DataGridViewButtonCell hinzuzufügen gegebenenfalls.

z.B.

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; 
      } 
     } 
    } 

Im obigen Beispiel habe ich zwei DataGridViewTextBoxColumns und durchlaufen jede der Zeilen auf einem Click-Ereignis-Taste. Ich überprüfe die erste Spalte, um zu sehen, ob sie "Bob" enthält, und wenn es so ist, füge ich einen Knopf in die Spalte daneben ein. Sie können diesen Trick verwenden, wie Sie möchten (d. H. Schaltflächenklicks, RowsAdded-Ereignis, CellEndEdit-Ereignis usw.). Experimentieren Sie auf verschiedene Arten. Hoffe das hilft jemandem!

1

können Sie Zelle Malerei auf Zell Malerei Ereignis behandeln:

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;  
    } 
} 
Verwandte Themen