2011-09-16 17 views
5

Ho un DataGridView con modalità di sola lettura impostato su true (non modificabile) che accetta valori da un database sul caricamento del modulo. Quando imposto la modalità di sola lettura su false (modalità modificabile), voglio che una particolare colonna (ad esempio Department) sia visibile come ComboBox in modo da poter selezionare i valori da lì. E quando entrerò in modalità di sola lettura, il ComboBox dovrebbe scomparire e DataGridView dovrebbe essere visibile come di consueto. Come raggiungerlo? Sto usando C# framework 4.0, WinformsComboBox in DatagridView in modalità di modifica

+0

Cosa intendi per 'scomparire'? Vuoi che l'intera colonna sia nascosta, o solo che la casella combinata sia disabilitata (cioè l'utente non può selezionare l'elenco a discesa dalla casella combinata? – SwDevMan81

+0

Voglio dire, la vista datagrid si trova nella sua modalità normale e nella casella combinata ma non nella colonna – Sandy

risposta

4

Vedere l'implementazione allo ComboBox with read only behavior.

È inoltre possibile modificare DisplayStyle in base a quando viene modificata la proprietà di sola lettura della proprietà DataGridView. L'impostazione di DisplayStyle su DataGridViewComboBoxDisplayStyle.Nothing nasconderà il pulsante a discesa.

Per esempio, la modifica della proprietà ReadOnly con un clic del pulsante sarebbe simile a questa:

private void mChangeReadOnlyButton_Click(object sender, EventArgs e) 
{ 
    ComboBoxColumn2.DisplayStyle = (dataGridView1.ReadOnly) ? 
     DataGridViewComboBoxDisplayStyle.ComboBox : 
     DataGridViewComboBoxDisplayStyle.Nothing; 
    dataGridView1.ReadOnly = !dataGridView1.ReadOnly; 
} 

modificabile:

Editable http://i51.tinypic.com/5e7o1w.jpg

ReadOnly:

ReadOnly http://i52.tinypic.com/1zgaxyt.jpg

+0

ho la mia soluzione in realtà, ma davvero dispiaciuto, l'ho cancellato per errore. e non l'ho cancellato ora. scusa per i guai. Ma nella mia soluzione sto affrontando un problema, quando il mio rowindex e columnindex sono uguali. la tua soluzione funziona bene per me. Grazie. – Sandy

1

Ho trovato la soluzione al mio problema, ho pensato di postarlo qui. Entrando in modalità di modifica, l'esecuzione del seguente codice può risolvere il problema.

public void bgCombo(DataGridView dg) 
{ 
    foreach (DataGridViewRow row in dg.Rows) 
    { 
     DataGridViewComboBoxCell dgc = new DataGridViewComboBoxCell(); 
     dgc.Value = row.Cells["Department"].Value; 
     row.Cells["Department"] = dgc; 
    } 
} 

Prima di impostare dgc su dataGridCell, è possibile aggiungere raccolte di elementi. Spero che sia d'aiuto.

PROBLEMA: Se l'indice di colonna e riga, diventa uguale durante la modifica, viene visualizzato un errore: l'operazione non è valida perché risulta in una chiamata di rientro alla funzione SetCurrentCellAddressCore.

+0

Adoro questo post. Tutto il resto che ho trovato in rete è stato prolisso e confuso e non proprio quello che stavo cercando LIFE RAVER !! :) –

+0

Sono felice di avere un tale commento :) – Sandy

1

Se si vuole nascondere una casella combinata per le righe selezionate è possibile utilizzare la proprietà DataGridViewComboBoxDisplayStyle

Le opzioni sono ComboBox, DropdownBox o Nessuno

Nell'esempio - visualizzare solo la casella combinata nella colonna 4 se c'è un valore in colonna 2

For Each row As DataGridViewRow In dgv.Rows 
     Dim Cell As DataGridViewComboBoxCell = CType(row.Cells(4), DataGridViewComboBoxCell) 
    Cell.ReadOnly = True 
    Cell.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing 
    If row.Cells(2).Value IsNot Nothing Then 
     Cell.ReadOnly = False 
     Cell.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox 
    End If 
Next 
Problemi correlati