Pergunta

Eu pensei que isso era simples como no acesso.

O usuário precisa definir o valor de uma coluna em um DataTable para 1 ou 2.

Eu queria apresentar um ComboBox mostrando "One", "Two" e definindo 1 ou 2 atrás da cena, como fiz muitas vezes em formas de acesso.

Por outro lado, se a tabela for mostrada, não deve mostrar 1 ou 2, mas a sequência correspondente no ComboBox.

Como posso fazer com que essa tarefa simples funcione?

Foi útil?

Solução

Suponho que você quis dizer DataGridView, que é para o Windows Forms, enquanto o GridView é para asp.net, embora você tenha marcado sua pergunta como tal.

Como você está vinculando os dados ao DataGridViewComBOBoxColumn? Você precisará definir o DisplayMember e as propriedades do Limber no DataGridViewComBOBOXCOLUMN enquanto configura seu DataSource. O link MSDN para o DisplayMember mostra um exemplo, mas não mostra o que você está solicitando, pois define as duas propriedades para a mesma coisa.

O membro do visor seria o texto que você deseja que o usuário veja, e o membro do Valueming seria o valor oculto subjacente associado a ele.

Por um exemplo, digamos que você tenha uma aula de escolha em seu projeto que represente suas seleções e se pareça com a seguinte:

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 () retornará uma lista que contém suas opções. Idealmente, você teria esse método em uma camada de serviço ou poderia construir sua própria lista em outro lugar, se quisesse (no código do seu formulário atrás). Por simplicidade, eu agrupei tudo na mesma classe.

No seu formulário, você vincularia a lista à DataGridViewComBOBoxColumn da seguinte forma:

// 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

Agora você deve ver "um" e "dois" no ComboBox. Quando você obtém o valor selecionado, deve ser o valor 1 ou 2 subjacente.

Essa é a ideia por trás de usar o DisplayMember/Valuember. Isso deve fazer você ir e ajudá -lo a adaptar a fonte de dados que você estava usando.

Outras dicas

É assim que você lê o valor da grade quando o valor no ComboBox muda:

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

fontes: esta postagem

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top