Pregunta

Tengo un requisito muy trivial en el que me hace ir nueces. Tengo un DataGridView en la solicitud de formas de las ventanas. Este contiene una columna ComboBox enlazado a datos. Estoy usando propiedades DisplayMember y ValueMember de ese cuadro combinado.

Ahora mi requisito es ComboBox debe mostrar la lista de DisplayMembers en la lista desplegable, pero cuando el usuario selecciona un elemento de la misma, que debe mostrar la parte de esta DisplayMember en la celda de cuadro combinado visible para el usuario. Por ejemplo.

Mis presentación de la lista miembro de miradas de la siguiente manera:

"Cust1 - Cliente 1" "Cust2 - Cliente 2" "Cust3 - Cliente 3"

y cuando el usuario selecciona uno cualquiera de ellos de la lista anterior. (Di usuario seleccionado 'Cust2 - del cliente 2') entonces tienen que mostrar el valor en la celda de la columna de cuadro combinado, ya que sólo "Cust2" en lugar de texto DisplayMember completa

Esta lista DisplayMember es una combinación de dos campos de la fuente de datos con destino a ella es decir, primera parte apunta al campo CustomerCode y el segundo nombre del cliente puntos de piezas. Necesito mostrar sólo CustomerCode en la celda después de ComboBox usuario selecciona un elemento de la lista desplegable.

¿Cómo puedo hacer esto? O debería llegar a mi propio control que tendrá un valor de miembro AutoCompleteCustomSource y visualización diferente. Incluso yo estoy confundido con este enfoque también.

Actualización: Como nadie ha llegado con cualquier solución a mi problema. Ahora estoy empezando una recompensa por eso, también si alguien me puede sugerir otra manera de implementar la misma funcionalidad, sería muy bueno.

he incluso trató de llegar a mi propio control y trató de trabajar en sencilla lista desplegable para mostrar un valor diferente de la lista desplegable seleccionada, aunque eso no funcionó. ¿Hay alguna otra forma de implementar esto? Algunos consejos y trucos son en gran medida apreciable.

@Anurag: Aquí está el código que he utilizado. Creado un DataGridView en el modo de diseño. Creado una columna de tipo 'DataGridViewComboBoxColumn' eso y lo nombró como CustomerColumn.

En el archivo del diseñador se ve como a continuación:

private System.Windows.Forms.DataGridViewComboBoxColumn CustomerColumn;

Esta es la clase de entidad que he utilizado para la fuente de datos

 public class Customer
 {
    public int Id { get; set; }
    public string CustCode { get; set; }
    public string CustName { get; set; }
    public string NameWithCode { get; set; }// CustCode - CustName format
 }

En el evento de carga del formulario estoy haciendo lo siguiente:

  CustomerColumn.DataSource = GetCustomers();
  CustomerColumn.DisplayMember = "NameWithCode";
  CustomerColumn.ValueMember = "Id";
¿Fue útil?

Solución

Estoy respondiendo a mi propia pregunta porque he aplicado mi propia solución a esto mediante el uso de controles personalizados.

Este control personalizado se crea guardando un cuadro de texto anterior cuadro combinado de tal manera que sólo soltar el botón del cuadro combinado abajo es visible.

Ahora he creado una columna personalizada en DataGridView derivar la DataGridViewEditingControl de mi usercontrol.

¡Tengo una propiedad en Usercontrol que tendrá desplegable origen de la lista de control que aloja DataGridView.

Ahora bien, en el caso EditingControlShowing Soy la creación de esta propiedad ya continuación

private void dataGridView2_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
  if(dataGridView2.CurrentCell.ColumnIndex.Equals(0) && e.Control is UserControl1)
  {
    var uscontrol = e.Control as UserControl1;
    uscontrol.DropDownListSource = source;
  }
}

Esta desplegables fuente lista se utiliza en el control de usuario para establecer el autocompletesource al cuadro de texto y la fuente de datos para el cuadro combinado como a continuación: Cada vez que me puse la DropDownDataSource estoy disparando un evento en el control de usuario que haga lo siguiente. Esto es para asegurar que cada evento se produce EditingControlShowing tiempo para esta columna en DataGridView, esta fuente se actualiza para el cuadro de texto y cuadro combinado en el control de usuario.

private void DropDownSourceChanged(object sender, EventArgs eventArgs)
{
  textBox1.AutoCompleteCustomSource = DropDownListSource;
  textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
  textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;

  comboBox1.DataSource = DropDownListSource;
}

Ahora, cuando el usuario comienza a escribir en el cuadro de texto fuente de autocompletado mostrará la lista desplegable de valores 'NameWithCode' y si un usuario selecciona de ellos a continuación, Voy a poner al hotel fenomenal texto alterada temporalmente en mi usercontrol que será utilizado para la célula valor en el DataGridView. Ahora basado en el texto del cuadro de texto (que es NameWithCode) puedo conseguir la parte de código y ponerlo en la propiedad de texto. Si usos de usuario COMBOBOX botón desplegable para seleccionar el elemento a continuación, voy a conseguir el texto seleccionado y el conjunto de cuadro combinado en el cuadro de texto que se utiliza en última instancia por la célula para obtener el valor.

Esta manera de que pudiera alcanzar la solución que yo quiero.

@Homam, solución también funciona, pero cuando cambio DropDownStyle del cuadro combinado para permitir al usuario escribir el valor en el cuadro combinado se comporta extrañamente y no tener que levantarse para la solución de marca para mi requisito. Por lo tanto he utilizado esta solución.

Otros consejos

Sé que esto no es una solución perfecta, pero me puse a buscar una mejor y no lo encontré, así que fui a un Solución:

Me hizo lo siguiente:

  1. cuando el usuario abra la ComboBox, cambio el DisplayMember a "NameWithCode"

  2. cuando el usuario está cercana, lo torno a "CustCode"

Se puede acceder al control de ComboBox por DataGridView.EditingControlShowing caso para el DataGridView.

El código:

private void dataGridView1_EditingControlShowing(object sender, 
    DataGridViewEditingControlShowingEventArgs e)
{
    var comboBox = e.Control as ComboBox;

    comboBox.DropDown += (s1, e1) => comboBox.DisplayMember = "NameWithCode";

    comboBox.DropDownClosed += (s2, e2) =>
        {
            // save the last selected item to return it after 
            // reassign the Display Member
            var selectedItem = comboBox.SelectedItem; 

            comboBox.DisplayMember = "CustCode";
            comboBox.SelectedItem = selectedItem;
        };
}

Nota: Tienes que iniciar el DisplayMember con "CustCode"

Buena suerte!

Cada vez que en la ofensiva de dataGridView1_EditingControlShowing caso de que haya adición de nuevos manejadores de eventos ComboBox.dropdown y comboBox.DropDownClosed. Esto resulta en el aumento del número de estos controladores y sus llamadas repetidas. Este código decide este problema.

private void dataGridView1_EditingControlShowing(object sender, 
      DataGridViewEditingControlShowingEventArgs e)
{
  var comboBox = e.Control as ComboBox;

  comboBox.DropDown += comboBox_DropDown;
  comboBox.DropDownClosed += comboBox_DropDownClosed;
}

private void comboBox_DropDown(object sender, System.EventArgs e)
{
  var comboBox = sender as ComboBox;
  if(comboBox != null)
  {
    comboBox.DropDown -= comboBox_DropDown;
    comboBox.DisplayMember = "NameWithCode";        
  }
}

private void comboBox_DropDownClosed(object sender, System.EventArgs e)
{
  var comboBox = sender as ComboBox;
  if(comboBox != null)
  {
    comboBox.DropDownClosed -= comboBox_DropDownClosed;

    var selectedItem = comboBox.SelectedItem; 

    comboBox.DisplayMember = "CustCode";
    comboBox.SelectedItem = selectedItem;        
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top