5

我想有一個DataGridView有兩列。第一列將始終是DataGridViewComboBoxColumn類型。基於該列中的選擇,我希望能夠將第二列中的相應單元格更改爲DataGridViewComboBoxCell或DataGridViewTextBoxCell。如何在DataGridViewTextBoxCell和DataGridViewComboBoxCell之間切換?

我在想我只需要使DataGridViewColumn類型的第二列,但不理解如何在飛行中更改單元格類型的機制。

我與VB.NET工作在Visual Studio提前2005

謝謝!

更新:它周圍的一種方式,我想,是使第二列作爲DataGridViewComboBoxColumn,並改變細胞的特性,使其無論是行爲就像一個下拉列表,或作爲(編輯)沒有元素的下拉菜單。後者看起來就像一個我可以忍受的文本框,它不會涉及改變單元格的類型。

回答

3

我沒有VB.Net版本,但希望這個快速的C#代碼段可以幫助您或者指出您朝着正確的方向發展。

在這個例子中,我設置了一個簡單的DataGridView和2列。第一個是填充了兩個選項的DataGridViewComboBox:「文本」或「組合」。

第二列最初設置爲來自設計者的DataGridViewTextBoxColumn。

我處理DataGridView上的CurrentCellDirtyStateChanged事件。我檢查單元是否髒,只檢查第一列(組合框)。您必須致電CommitEdit以獲得組合中的新值,否則您將查看先前的值。根據組合框中的選擇,然後使用該類型的新單元格覆蓋第二列中的單元格。

您將添加自己的邏輯(填充下拉列表並處理該值)。您可能想要存儲該值,然後將其放回到單元格中或其他內容中。

這裏是我使用,並做了一個快速和骯髒的測試代碼:

private void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) 
    { 
     if (dataGridView1.IsCurrentCellDirty == false) 
     { 
      return; 
     } 

     dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); 

     if (dataGridView1.CurrentCell.ColumnIndex == 0) 
     {    
      if (((string)dataGridView1.CurrentCell.Value) == "Text") 
      { 
       dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1] = new DataGridViewTextBoxCell(); 
      } 
      else if (((string)dataGridView1.CurrentCell.Value) == "Combo") 
      { 
       dataGridView1.Rows[dataGridView1.CurrentCell.RowIndex].Cells[1] = new DataGridViewComboBoxCell(); 
      } 
     } 
    } 

下面是一個簡單的VB的翻譯,我測試和工程。

Public Class Form1 

Private Sub DataGridView1_CurrentCellDirtyStateChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged 

    If DataGridView1.IsCurrentCellDirty = False Then 
     Return 
    End If 

    DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit) 

    If DataGridView1.CurrentCell.ColumnIndex = 0 Then 

     If CStr(DataGridView1.CurrentCell.Value) = "Text" Then 
      DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(1) = New DataGridViewTextBoxCell 

     ElseIf CStr(DataGridView1.CurrentCell.Value) = "Combo" Then 
      DataGridView1.Rows(DataGridView1.CurrentCell.RowIndex).Cells(1) = New DataGridViewComboBoxCell 
     End If 

    End If 


End Sub 

末級

你將失去​​存儲在該列的任何值,所以你需要先將其保存。

Jon

+0

謝謝。這很有幫助。我不是一個真正的VB或者一個。NET專家,所以我原則上看到你在做什麼,但是在VB中分配新的DataGridViewTextBoxCell或新的DataGridViewComboBoxCell的機制是我仍然必須弄清楚的。無論如何,我很欣賞你把答案寫入你的答案,今天下午我會試一試。 – John 2009-11-23 17:51:38

+0

工程很好。謝謝! – John 2009-11-25 00:57:06

2

您可以創建自己的託管用戶控件的單元模板。在用戶控件中添加一個文本框和一個組合框,並添加一個方法/屬性來顯示一個並隱藏另一個。

This sample創建單選按鈕單元格,不難更改代碼以承載用戶控件。

0
dgvCell = new DataGridViewTextBoxCell();   // code to remove checkbox 
     dgvCell.Value = string.Empty; 
     dgv_modi_del_trans.Rows[1].Cells[0] = dgvCell;