valor usando permitir otro openoffice listas listado lista extraer escribir devolver desplegables desplegable dependiente datos coincidencias busqueda buscav buscar bloquear automatica c# combobox

c# - usando - ¿Cómo puedo evitar la selección automática en el menú desplegable de ComboBox excepto las coincidencias exactas?



lista desplegable dependiente openoffice (1)

Hizo un código de muestra que podría ayudar: puede usarlo como guía.

La idea es manejar el evento TextChanged del ComboBox , y realmente solo modificar los ComboBox list items en ese punto. El siguiente ejemplo modificará la lista para agregar el texto actual (lo más importante, ya que esto no cambiará el texto cuando haga clic en el cuadro combinado) y cualquier otro elemento que cumpla con los criterios de búsqueda.

No creo que necesite el código para volver a inicializar los elementos de la lista cuando se pierde el foco, pero se deja allí por si acaso.

//contains a list of default items for the combobox items List<string> comboList = new List<string>(); public Form1() { InitializeComponent(); initComboList(); //initialize the defaults initCombobox(); //initialize the combobox list items } //fills the defaults for the combobox items private void initComboList() { comboList.Add("red"); comboList.Add("blue"); comboList.Add("green"); } //initializes the combobox items private void initCombobox() { comboBox1.Items.Clear(); foreach (string s in comboList) comboBox1.Items.Add(s); } //occurs when the text changes in the combobox private void comboBox1_TextChanged(object sender, EventArgs e) { string curtext = comboBox1.Text; insertIntoComboBox(curtext); //insert the current text into combobox comboBox1.Select(curtext.Length, 0); //if you don''t do this, the cursor goes back to index 0 :-( } //called whenever is desired to insert the current text into the combobox items private void insertIntoComboBox(string curtext) { comboBox1.Items.Clear(); //only add the current text if it''s not already in the list of defaults and not empty string if (comboList.Contains(curtext) == false && curtext.Length > 0) comboBox1.Items.Add(curtext); foreach (string s in comboList) comboBox1.Items.Add(s); } //called whenever combobox loses focus private void comboBox1_Leave(object sender, EventArgs e) { initCombobox(); }

Tengo un ComboBox que es parte de una pantalla de detalles relacionada con una cuadrícula de datos que contiene filas de una base de datos. No existe un enlace al ComboBox, lo estoy haciendo manualmente. El ComboBox permite la entrada manual, como si fuera un campo de texto, al tiempo que proporciona un menú desplegable de opciones.

Mi problema es que si he ingresado texto manualmente en el campo y se hace clic en el menú desplegable, el ComboBox aparentemente quiere buscar una coincidencia. Además, parece que la búsqueda es simple, por lo que KG coincide con KG/Day . Debo evitar esto y forzar una coincidencia exacta.

Pero además, creo que necesito poder gobernar todo el proceso yo mismo, porque para complicar aún más el asunto, el elemento desplegable leería KG/Day - kilograms/day . Sin embargo, el campo de la base de datos de donde se extraen los datos solo almacena la parte anterior al guion, por lo que KG/Day .

Entonces, necesito interceptar la acción desplegable de una manera que me permita hacer dos cosas:

1) Realizo mi propia búsqueda para encontrar si tengo o no texto ad-hoc, o una coincidencia "real". Como en que originalmente fue seleccionado del desplegable; en otras palabras, que tengo KG/Day y no solo KG .

2) Elimine el comportamiento de búsqueda automática que ComboBox desea hacer.

He tratado de ponerme al frente de estas cosas usando manejadores de métodos en el Formulario, como

ComboBox :: DropDown () y ComboBox :: DropDownClosed (),

pero parece que estos todavía no me permiten detener la búsqueda / coincidencia básica de ComboBox.

También he intentado crear una clase heredada de ComboBox, pero realmente no sé qué anular ni, en general, cómo conseguir lo que quiero, deteniendo lo que no.

Entonces, con eso, te agradezco tu consejo.

EDITAR: para ampliar lo que ya intenté ... En mi clase heredada, estaba intentando utilizar una anulación de WndProc . De acuerdo con algunos consejos que encontré en otro foro, mi objetivo era interceptar el mensaje ComboBox LB_FINDSTRING y reemplazarlo por LB_FINDSTRINGEXACT . La publicación sugería que ComboBox LB_FiNDSTRING predeterminado de LB_FiNDSTRING , que se ajusta a lo que veo que hace, y que LB_FINDSTRINGEXACT podría solucionar el problema. El problema es que, a menos que obtuviera una mala definición para LB_FINDSTRING , nunca se recibió.

Aquí está mi enum:

[Flags] public enum ListBoxFlags { LB_ADDSTRING = 0x0180, LB_SETSEL = 0x0185, LB_GETSELITEMS = 0x0191, LB_GETSELCOUNT = 0x0190, LB_GETCURSEL = 0x0188, LB_SELECTSTRING = 0x018C, LB_SETCURSEL = 0x0186, LB_FINDSTRING = 0x018F, LB_FINDSTRINGEXACT = 0x01A2, LB_GETCOUNT = 0x018B, LB_GETSEL = 0x0187, LB_GETTEXT = 0x0189, LB_RESETCONTENT = 0x0184, LB_SETHORIZONTALEXTENT = 0x0194, LB_GETHORIZONTALEXTENT = 0x0193, LB_GETTOPINDEX = 0x018E, LB_SETTOPINDEX = 0x0197, LB_INSERTSTRING = 0x0181, LB_DELETESTRING = 0x0182, LB_GETITEMDATA = 0x0199 }