2009-09-07 19 views
6

Ho pensato che fosse semplice come in Access.DataGridViewComboBox Nome colonna/valore come?

utente deve impostare il valore di una colonna in una datatable su 1 o 2.

ho voluto presentare un "ONE" combobox mostra, "due" e l'impostazione 1 o 2 dietro la scena, come Ho fatto molte volte in Access-Forms.

Dall'altro lato, se viene mostrata la tabella, questa non deve mostrare 1 o 2 ma la stringa corrispondente nel ComboBox.

Come posso far funzionare questa semplice operazione ??

risposta

12

Suppongo che intendessi DataGridView, che è per Windows Forms, mentre GridView è per ASP.NET anche se hai taggato la tua domanda come tale.

Come si vincolano i dati a DataGridViewComboBoxColumn? È necessario impostare le proprietà DisplayMember e ValueMember su DataGridViewComboBoxColumn mentre si imposta DataSource. Il link MSDN a DisplayMember mostra un esempio, ma non mostra esattamente cosa stai richiedendo poiché imposta entrambe le proprietà sulla stessa cosa.

Il DisplayMember è il testo che si desidera venga visualizzato dall'utente e ValueMember sarebbe il valore sottostante nascosto ad esso associato.

Per il bene di un esempio, supponiamo di avere una classe scelta del progetto che rappresenta le selezioni e si presenta così:

public class Choice 
{ 
    public string Name { get; private set; } 
    public int Value { get; private set; } 
    public Choice(string name, int value) 
    { 
     Name = name; 
     Value = value; 
    } 

    private static readonly List<Choice> possibleChoices = new List<Choice> 
    { 
     { new Choice("One", 1) }, 
     { new Choice("Two", 2) } 
    }; 

    public static List<Choice> GetChoices() 
    { 
     return possibleChoices; 
    } 
} 

GetChoices() restituirà una lista contenente le vostre scelte. Idealmente, si avrebbe un tale metodo in un livello di servizio, o si potrebbe costruire la propria lista altrove se si desidera (nel codice della forma dietro). Per semplicità ho messo tutto insieme nella stessa classe.

Nel modulo si legherebbe l'elenco per il DataGridViewComboBoxColumn come segue:

// reference the combobox column 
DataGridViewComboBoxColumn cboBoxColumn = (DataGridViewComboBoxColumn)dataGridView1.Columns[0]; 
cboBoxColumn.DataSource = Choice.GetChoices(); 
cboBoxColumn.DisplayMember = "Name"; // the Name property in Choice class 
cboBoxColumn.ValueMember = "Value"; // ditto for the Value property 

Si dovrebbe ora vedere "One" e "Two" nella casella combinata. Quando si ottiene il valore selezionato da esso, dovrebbe essere il valore sottostante 1 o 2.

Questa è l'idea alla base dell'utilizzo di DisplayMember/ValueMember. Questo dovrebbe farti andare e aiutarti ad adattare l'origine dati che stavi usando.

+0

Questa è la risposta perfetta! Grazie Ahmad! Reinhard –

+2

Come possiamo leggere il valore selezionato di una cella dropdown in datagrid? – Meysam

+0

Non sapevo che era così semplice! Grazie – Jack

3

Questo è il modo di leggere il valore dalla rete quando il valore nelle modifiche ComboBox:

dataGridView1.EditingControlShowing += dataGridView1_EditingControlShowing; 

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
{ 
    if (dataGridView1.CurrentCell.ColumnIndex == 0 && e.Control is ComboBox) 
    { 
     ComboBox comboBox = e.Control as ComboBox; 
     comboBox.SelectedIndexChanged += LastColumnComboSelectionChanged; 
    } 
} 

private void LastColumnComboSelectionChanged(object sender, EventArgs e) 
{ 
    var sendingCB = sender as DataGridViewComboBoxEditingControl; 
    object value = sendingCB.SelectedValue; 
    if (value != null) 
    { 
     int intValue = (int)sendingCB.SelectedValue; 
     //do something with value 
    } 
} 

fonti: this post

Problemi correlati