winform una net llenar enlazar datos como c# .net binding combobox

c# - una - Datos de enlace correctos al cuadro combinado y manejo de sus eventos



llenar combobox c# (5)

Acabo de hacer una prueba yo mismo, y creo que lo que podrías estar buscando está ligado al evento equivocado (tal vez incluso al objeto equivocado).

Simplemente intenté agregar el evento al controlador PositionChanged del objeto CurrencyManager (cmUsers) y funcionó exactamente como estaba previsto. El único problema que tuve con esto fue la primera vez que se cargó, no golpeó el PositionChanged por lo que el primer elemento nunca se une a la etiqueta (estoy seguro de que hay una solución más fácil). http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingmanagerbase.positionchanged.aspx

Se realizó una pequeña prueba para ver qué evento se activó primero, y parece que el evento SelectionChangeCommitted se disparó antes del PositionChanged, lo que significa que CurrencyManager aún no ha actualizado su posición interna, por lo que la línea:

DataRowView drvCurrentRowView = (DataRowView)cmUsers.Current;

Tira del DataRow incorrecto.

Olvidé tu segundo problema. La mayoría de los controles no manejan las pulsaciones de teclas, entonces lo que debe hacer es vincular los eventos OnKeyDown o OnKeyPress para ejecutar cualquier función que desee (encontrar el índice asociado con el objeto tipeado [es decir, FindString ()] y establecer la propiedad ComboBox.SelectedIndex para el índice encontrado; de lo contrario, muestra una advertencia). Por ejemplo:

if(e.KeyCode == Keys.Enter) { int indx; cmbBox.SelectAll(); if((indx = FindString(cmbBox.SelectedText)) != -1) cmbBox.SelectedIndex = indx; else // Some warning }

Editar Después de leer sus comentarios, calculé una forma más fácil de hacer la validación. En el evento "KeyPress" de ComboBox, use el siguiente código:

if(e.KeyChar != (char)Keys.Enter) { if(cmbBox.FindString(cmbBox.Text + e.KeyChar) == -1) { e.Handled= true; } }

Sin alboroto, sin muss. Dado que estamos limitando a solo los elementos de la lista aquí, no necesitamos manejarlos cuando presionen Enter ya que debería cambiar automáticamente el elemento seleccionado (sin embargo, no estaría de más ejecutar una validación para asegurarse de que sea el correcto cAsE, o simplemente cambió la propiedad SelectedIndex manualmente en Enter keypress). Aún así, espero que esto haya ayudado a alguien.

Tengo una tabla en SQL Server que se ve así:

ID Code Name Surname 1 MS Mike Smith 2 JD John Doe 3 UP Unknown Person

y así...

Ahora quiero vincular los datos de esta tabla al ComboBox de manera que en el ComboBox he mostrado el valor de la columna Código.

Estoy haciendo el enlace de esta manera:

SqlDataAdapter sqlAdapter = new SqlDataAdapter("SELECT * FROM dbo.Users ORDER BY Code", MainConnection); sqlAdapter.Fill(dsUsers, "Users"); cbxUsers.DataSource = dsUsers.Tables["Users"]; cmUsers = (CurrencyManager)cbxUsers.BindingContext[dsUsers.Tables["Users"]]; cbxUsers.DisplayMember = "Code";

Y este código parece funcionar. Puedo desplazarme por la lista de Códigos. También puedo comenzar a escribir código a mano y ComboBox autocompletará el código por mí.

Sin embargo, quería poner una etiqueta en la parte superior del cuadro combinado para mostrar el nombre y el apellido del código de usuario seleccionado actualmente.

Mi línea de pensamiento era así: "Entonces, necesito encontrar un evento que se active después del cambio de código en el cuadro combinado y en ese caso obtendré el DataRow actual ..."

Estaba navegando por los eventos de combobox, intenté muchos de ellos pero sin éxito.

Por ejemplo:

private void cbxUsers_SelectionChangeCommitted(object sender, EventArgs e) { if (cmUsers != null) { DataRowView drvCurrentRowView = (DataRowView)cmUsers.Current; DataRow drCurrentRow = drvCurrentRowView.Row; lblNameSurname.Text = Convert.ToString(drCurrentRow["Name"]) + " " + Convert.ToString(drCurrentRow["Surname"]); } }

Esto me da resultados extraños. En primer lugar, cuando me desplazo por el desplazamiento del mouse no me devuelve la fila que espero obtener. Por ejemplo en JD me muestra "Mike Smith", en MS me muestra "John Doe" y en UP me muestra "Mike Smith" otra vez. El otro problema es que cuando comienzo a escribir ComboBox y presiono enter, no desencadena el evento.

Sin embargo, todo funciona como se espera cuando enlace datos a lblNameSurname.Text de esta manera:

lblNameSurname.DataBindings.Add("Text", dsusers.Tables["Users"], "Name");

El problema aquí es que puedo vincular solo una columna y quiero tener dos. No quiero usar dos etiquetas (una para mostrar el nombre y otra para mostrar el apellido).

Entonces, ¿cuál es la solución a mi problema?

Además, tengo una pregunta relacionada con la selección de datos en ComboBox. Ahora, cuando escribo algo en el cuadro combinado, me permite escribir letras que no existen en la lista. Por ejemplo, empiezo a escribir "J" y, en lugar de terminar con "D", tendría "JD" y escribo "Jsomerandomtexthere". Combobox lo permitirá pero ese artículo no existe en la lista. En otras palabras, quiero que combobox evite que el usuario escriba código que no está en la lista de códigos.


Bueno, podrías cambiar tu SQL para obtener el nombre y el apellido como una columna, y luego vincular una vez a esa columna. Además, pondría el combo y la etiqueta en un panel de actualización de Ajax.

En cuanto a la validación: para validar en el cliente, debe tener todos los valores posibles en el cliente con anticipación, o devolución de datos para cada char y presionar el SQL con a (lo que probablemente no sea una buena idea: elimina el servidor):

SELECT code FROM TABLE WHERE code LIKE @x + ''%''

¿Es una opción aceptable una caja de autocompletar? Eche un vistazo a la caja de autocompletado de jQuery , por ejemplo.


Para su segunda pregunta, las dos formas en que normalmente lo hago es manejar el evento de Validating para el cuadro combinado antes de abandonar el formulario (y deshabilitar el botón Continuar o lanzar un mensaje de error) o establecer ComboBox.DropDownStyle en ComboBoxStyle.DropDownList


Por lo general, el evento de cambio de índice seleccionado se produce cuando cambia su selección y mueve su foco fuera del menú desplegable, como hacer clic afuera o presionar la tecla tab ...

Si necesita activarlo inmediatamente, debe buscar algún otro evento o evento de invocación mediante el evento JavaScript onchange , etc.


Pruebe lo siguiente:

Crea un objeto de enlace manualmente para que tengas una referencia al mismo. Use el objeto Binding para enlazar a la propiedad SelectedItem de su ComboBox. Creo que esto debería darte el DataRow seleccionado. Agregue ese objeto de enlace a la colección DataBindings de la etiqueta.

Maneje el evento Binding.Format (o puede ser Parse, no puede recordar qué evento se aplica cuando se vincula en qué dirección) y use el objeto DataRow que recibe en el objeto args del evento para formar una cadena de nombre apropiada que contenga nombre y apellido . Deberá establecer alguna otra propiedad de EventArgs en esa cadena.

También es posible que tengas que jugar con la propiedad FormattingEnabled de la clase Binding. Ha pasado un tiempo desde la última vez que lo hice, solo recuerdo que fue un poco complicado.

Consulte la documentación para los eventos Parse y Format: http://msdn.microsoft.com/en-us/library/system.windows.forms.binding_events.aspx