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