2010-11-23 44 views
4

我想更新這個DataGridView對象,使得如果一個值==「bob」的名字旁邊會有一個按鈕,否則我不想出現任何按鈕。如何將按鈕添加到我的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); 
} 

但是,由於我無法在單元格上設置Visible,因此這不起作用。有沒有一種方法來添加一個按鈕,只有行的值是==「bob」?

回答

2

這裏有兩種可能性,一種是醜陋的,另一種來自MSDN。

醜陋:在運行時你DGV添加一個按鈕

執行以下操作:
- 未綁定DataGridViewTextBoxColumn添加到您的DGV。請注意,它是DGV中的索引值;這是您放置按鈕的位置。
- 用你的DGV的CellFormatting事件,像這樣:

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

當用戶點擊該按鈕cellButton_Click事件將觸發。這裏有一些測試代碼:

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

正如你所看到的,這不是很精緻。我根據我發現的更加醜陋的樣本進行分析。我相信你可以修改它以適應你的需求。

來自MSDN:滾動您自己的(擴展)DataGridViewButtonColumn,它有條件地顯示禁用的按鈕。

對於此選項看到How to: Disable Buttons in a Button Column in the Windows Forms DataGridView Control

當然這個選項實際上並不刪除任何按鈕,只能在一定條件禁用他們。但是,對於您的應用程序,這可能會更好。

3

這裏是我以前用來完成這個整潔的小黑客:

而不是使用一個DataGridViewButtonColumn的,使用DataGridViewTextBoxColumn並添加DataGridViewButtonCell在適當情況下。

例如

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

在上面的示例中,我有兩個DataGridViewTextBoxColumns並遍歷按鈕單擊事件中的每個行。我檢查第一列以查看它是否包含「bob」,如果它包含,我在旁邊的列中添加一個按鈕。不管你想要什麼,你都可以使用這個技巧(即按鈕點擊,RowsAdded事件,CellEndEdit事件等)。以不同方式進行實驗。希望這可以幫助別人!

1

您可以在細胞畫事件處理單元畫:

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;  
    } 
} 
相關問題