visual valuemember valor studio obtener item from combo c# winforms data-binding combobox

c# - valuemember - Combobox no permite ingresar texto personalizado si se usa DataBinding



select value from combobox c# (6)

El problema es que tener enlaces de datos de combobox no permite escribir valores personalizados en este cuadro combinado. ¿Hay una solución para este comportamiento?

¡Así que no lo ates! Escriba sus propios métodos para rellenar el cuadro combinado y el controlador de eventos para editar elementos.


Tengo la siguiente clase:

class Address { public string City {get; set;} public string Street {get; set;} }

y tengo un formulario con 2 comboboxes en él. Ato estos comboboxes a la clase Dirección:

CityComboBox.DataSource = GetCityDataSource(); StreetComboBox.DataSource = GetStreetDataSource(); Address address = new Address(); CityComboBox.DataBindings.Add("SelectedItem", address, "City"); StreetComboBox.DataBindings.Add("SelectedItem", address, "Street");

La base de datos de Ciudades y Calles no está completa, por lo que a veces el usuario debe escribir valores personalizados en el cuadro combinado. El problema es que tener enlaces de datos de combobox no permite escribir valores personalizados en este cuadro combinado. ¿Hay una solución para este comportamiento?
¡Gracias por adelantado!


Cómo lo hago (no uso enlace de datos):

  • Inicialice una instancia de la List<T> (puede ser List<Address> en su caso).
  • Lea los elementos de la base de datos en una List<T> .
  • Rellene sus cuadros combinados utilizando los elementos que se encuentran en la List<T> .
  • Cuando se crea un nuevo elemento, inserte ese elemento en su base de datos.
  • Reinicie en la parte superior (se presta a un procedimiento al que puede llamar en cualquier momento).

Si debe vincular los datos, puede ocultar el cuadro combinado y abrir un cuadro de texto hasta que el usuario guarde su información, pero aún tendrá que escribir en su base de datos y leer los datos nuevamente.


Debe insertar un nuevo valor en la fuente de datos (si se trata de una matriz, cambie el tamaño de una matriz y agregue el nuevo valor en el nuevo índice; si esta es una lista generi, simplemente agregue un nuevo elemento).


Mira esto:

public partial class Form1 : Form { BindingList<Address> list; public Form1() { InitializeComponent(); list = new BindingList<Address>(); //lets add some example data: list.Add(new Address{ City = "London", Street = "Street 111" }); list.Add(new Address { City = "Barcelona", Street = "Street 222" }); comboBox1.DataSource = list; //I am not sure what you want to show (and what to use as a value). You can change this! comboBox1.DisplayMember = "Street"; comboBox1.ValueMember = "City"; } private void button1_Click(object sender, EventArgs e) { //adding new object to the list: string _city = textBox1.Text; string _street = textBox2.Text; if (_city != String.Empty && _street != String.Empty) { list.Add(new Address { City = _city, Street = _street }); textBox1.Text = ""; textBox2.Text = ""; } } } class Address { public string City { get; set; } public string Street { get; set; } }


Tal vez podría manejar los eventos clave y cuando comienzan a escribirlos, ¿se agrega un nuevo elemento?


Esto funciona: (en su caso)

Establezca DrowdownStyle en DrowdownStyle y DrowdownStyle a la propiedad Text del ComboBox en lugar de SelectedItem .

Para los dos cuadros combinados, parece que desea enlazar el texto a las propiedades de City y Street de una instancia de la clase de Address . Parece que no desea agregar ningún elemento en la List<string> devuelto por los GetCityDataSource() o GetStreetDataSource() .

Por lo tanto, dado que la propiedad de destino de Text del enlace a continuación no está enredada con la colección de elementos ( unchangeable ) asociada con su fuente de datos , las siguientes modificaciones deben hacer que su código funcione: (He verificado la esencia de los cambios de código a continuación usando VS 2010).

CityComboBox.DataSource = GetCityDataSource(); StreetComboBox.DataSource = GetStreetDataSource(); Address address = new Address(); CityComboBox.DropDownStyle = ComboBoxStyle.DropDown CityComboBox.DataBindings.Add("Text", address, "City"); StreetComboBox.DropDownStyle = ComboBoxStyle.DropDown StreetComboBox.DataBindings.Add("Text", address, "Street");

¡PD! El enfoque anterior solo funciona cuando desea utilizar los datos de Ciudad y Calle para una guía de UI simple. No está estableciendo una relación permanente entre los datos de la dirección y los objetos para los que registra una dirección. Si desea mantener sus datos normalizados, entonces desea almacenar claves externas para las entradas en las tablas Ciudad, Calle (y tal vez Código postal).

Con los nombres de calles y ciudades definidos por el usuario, obtendrá una gran cantidad de datos confusos (por ejemplo, Washington DC , WASHINGTON DC , St. Patricks rd. , Saint Patrick''s road etc.) que en el futuro dificultarán la ejecución de consultas SQL utilizando WHERE Street = [something] . Con los datos normalizados, simplemente haría un WHERE StreetID = [specificID] .

EDITAR

Si está intentando hacer dos cosas al mismo tiempo dentro del mismo cuadro de diálogo de la interfaz de usuario (tanto la selección de calle y ciudad para, por ejemplo, un perfil de persona / empresa , así como el mantenimiento de las listas internas de calles y ciudades de su aplicación), entonces tiene que usar un enfoque diferente.

El más simple es probablemente agregar una "nueva ciudad" y un botón de "nueva calle" al lado de su cuadro combinado y actualizar la fuente de datos para el cuadro combinado cuando el usuario haya proporcionado la entrada adecuada en un diálogo.

También puede agregar una entrada ficticia a la fuente de datos del cuadro combinado con la cadena "[agregar Nuevo]", y usar un manejo especial cuando se selecciona este elemento. Dado que este enfoque implica manipular la lista de fuentes para el combo, puede ensuciarse un poco fácilmente.

Aplicación de muestra

Un formulario de muestra con un ComboBox de base de datos que utiliza un origen de datos de List<string>

Propiedades clave después de seleccionar una calle predefinida

Propiedades clave después de seleccionar una calle personalizada