elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Usar enum con combobox.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Usar enum con combobox.  (Leído 1,052 veces)
#Aitor

Desconectado Desconectado

Mensajes: 173



Ver Perfil
Usar enum con combobox.
« en: 13 Julio 2018, 22:46 »

Estoy usando una API en C#.net, la cosa es que, la API tiene un método para cada diferente región de servidores. (Euw, Na, Lan, Las, Oce, etc...) pero la forma de llamar a la región es dentro de un método ¿a traves de otro método? no tengo muy claro como se le llamaría.

Pongo un ejemplo.

Código
  1. api.GetSummonerByName(RiotSharp.Misc.Region.euw, NombreBox.Text);

El método GetSummonerByName espera la región, y el nombre del jugador (un string).

La cosa es que RiotSharp.Misc.Region.[SERVIDOR] es... ¿un método? y no sé como podría selecionar cada propiedad de ese método (no tengo ni la menor idea de si lo estoy diciendo bien...) sin tener que montarme un case para cada servidor.

He leído que es de tipo enumerador, (cada servidor está asociado a un entero), pero ni idea de como asociarlo en un ComboBox.

¡Gracias de antemano!

Adjunto documentacion de la API: http://benfradet.github.io/RiotSharp/api/RiotSharp.Region.html


En línea

Mi algoritmo en PHP (estupideces y más).
Código
  1. while($Se_feliz){
  2.  Piensa_un_OBJETIVO(); // Sin excusas!
  3.  if($Tienes_un_objetivo){
  4.    Suspira(); // Sé paciente.
  5.    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
  6.      //RETURN; ¿O volvemos a empezar?
  7.    }else{
  8.      Inténtalo_de_nuevo();
  9.    }
  10.  }
  11. }
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Usar enum con combobox.
« Respuesta #1 en: 15 Julio 2018, 11:11 »

La cosa es que RiotSharp.Misc.Region.[SERVIDOR] es... ¿un método?

No es un método, es una Enum o tipo enumerado, representa una enumeración de valores de tipo int (en este caso). En el propio enlace que has compartido dice bien claro en letras grandes: "Enum Region"

Sin ánimo de ofender pero antes de que un programador se ponga a utilizar APIs de terceros e historias, primero se debería aprender lo básico del lenguaje, al menos hasta tener claro cuantos y qué tipos de miembros existen, sus diferencias, etc...

Podrías empezar por estudiar esto ya que tienes dudas con los tipos enumerados:



Usar enum con combobox

Tan solo debes obtener los nombres de la Enum (o los valores int, ségún los datos que desees mostrar en la UI) y agregarlos al ComboBox, por ejemplo:

Código
  1. comboBox1.DataSource = Enum.GetNames(typeof(RiotSharp.Misc.Region));

Luego puedes usar la función Enum.Parse() para parsear el nombre seleccionado en el ComboBox.

Saludos


« Última modificación: 15 Julio 2018, 11:13 por Eleкtro » En línea


#Aitor

Desconectado Desconectado

Mensajes: 173



Ver Perfil
Re: Usar enum con combobox.
« Respuesta #2 en: 15 Julio 2018, 16:46 »

Sin ánimo de ofender pero antes de que un programador se ponga a utilizar APIs de terceros e historias, primero se debería aprender lo básico del lenguaje, al menos hasta tener claro cuantos y qué tipos de miembros existen, sus diferencias, etc...

Sé que tienes toda la razón...



¿Te importaría decirme en última instancia que estoy haciendo mal? la verdad es que no entiendo como demonios meter la parte de servidor.

Me explico, conecté los datos del enum al combobox.

 
Código
  1. comboBox1.DataSource = Enum.GetValues(typeof(RiotSharp.Misc.Region));

De forma que me lista correctamente todos los servidores. Mi idea ahora es parsear el item selecionado e incrustrarlo en RiotSharp.Misc.Region.[DatoDelCombobox]. La cosa está en que he intentado de varias maneras.

La última que intenté y de la cuál creo que estoy cerca es la siguiente:

Código
  1.   var t = Enum.Parse(typeof(RiotSharp.Misc.Region), comboBox1.SelectedValue.ToString());

de esta forma T tiene el valor parseado del combobox, digamos EUW.

Tal como se indica en este video [Aporto minuto exacto]: https://youtu.be/3IJmPmqGJKo?t=1082

Ahora bien, T es de tipo vete a saber qué (no me odies por todo esto, Elektro...) la cosa es que supongo que será del mismo tipo que Region.[Servidor] está esperando. (ya que probé a meter un entero y un string a la fuerza y no se lo tragó).

Pero nada, que incluso teniendo la variable t con el tipo que se supone que región espera no consigo aplicarlo.

Probé cosas como:

Código
  1. ' Espero que no te haga daño a la vista...
  2. api.GetSummonerByName(t, Name.Text);
  3. api.GetSummonerByName(RiotSharp.Misc.Region t, Name.Text);
  4. api.GetSummonerByName(RiotSharp.Misc.Region.t, Name.Text);
  5. api.GetSummonerByName(RiotSharp.Misc.Region(Enum.Parse(typeof(RiotSharp.Misc.Region), comboBox1.SelectedValue.ToString())), Name.Text);
  6.  

Y nada, que no dejo de comerme la cabeza y que siento la torpeza...
En línea

Mi algoritmo en PHP (estupideces y más).
Código
  1. while($Se_feliz){
  2.  Piensa_un_OBJETIVO(); // Sin excusas!
  3.  if($Tienes_un_objetivo){
  4.    Suspira(); // Sé paciente.
  5.    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
  6.      //RETURN; ¿O volvemos a empezar?
  7.    }else{
  8.      Inténtalo_de_nuevo();
  9.    }
  10.  }
  11. }
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Usar enum con combobox.
« Respuesta #3 en: 15 Julio 2018, 18:05 »

Ahora bien, T es de tipo vete a saber qué (no me odies por todo esto, Elektro...)

"t" es del mismo tipo que el valor de retorno de la función a la que estás llamando, Enum.Parse() devuelve un valor de tipo object, por ende "t" es de tipo object... y eso no es lo que quieres, te faltaría hacer el casting / conversión de tipos:

Código
  1. var region = (RiotSharp.Misc.Region)Enum.Parse(typeof(RiotSharp.Misc.Region), comboBox1.SelectedValue.ToString());

De todas formas el uso del keyword "var" yo no lo recomendaría por que visualmente entorpece la inteligibilidad del código dando lugar a posibles confusiones como la que has tenido de no saber cual es el tipo implícito, en mi opinión eso afecta a la productividad del programador; en lugar de usar "var" siempre tienes la opción de hacer una declaración de tipo explícito tal que así:

Código
  1. RiotSharp.Misc.Region region = (RiotSharp.Misc.Region)Enum.Parse(typeof(RiotSharp.Misc.Region), comboBox1.SelectedValue.ToString());

Y luego, suponiendo que el método GetSummonerByName tome como primer parámetro un valor de la enumeración RiotSharp.Misc.Region, pues lo llamarías así:

Código
  1. api.GetSummonerByName(region, Name.Text)



Te dejo por aquí un par de lecturas más:


PD: dime que estudiarás un poco más a fondo los conceptos básicos del lenguaje y no te odiaré xD

Saludos
« Última modificación: 15 Julio 2018, 19:45 por Eleкtro » En línea


#Aitor

Desconectado Desconectado

Mensajes: 173



Ver Perfil
Re: Usar enum con combobox.
« Respuesta #4 en: 16 Julio 2018, 00:23 »


Código
  1. RiotSharp.Misc.Region region = (RiotSharp.Misc.Region)Enum.Parse(typeof(RiotSharp.Misc.Region), comboBox1.SelectedValue.ToString());


Funciona a la perfección. ¿Por qué es necesario poner (RiotSharp.Misc.Region) antes del enum? Supongo que terminaré descubriniendolo tras leer los documentos que dejaste. Encuentro tedioso que haya tan poca información sobre .net en español en cuánto a vídeos se refiere, o al menos no veo que traten estos temas, pues siento que soy una persona que aprende más tranquila viendo un vídeo que siguiendo una lectura.



Por cierto, he visto que la lista del enum tiene un orden que no me gusta, digamos A C B y quisiera A B C, así que pensé en buscar el source del enum y cambiarlo a mi manera, (pero o no lo encuentro, o quizá sean los .dlls y no se puede editar...?)


Te dejo por aquí un par de lecturas más:


PD: dime que estudiarás un poco más a fondo los conceptos básicos del lenguaje y no te odiaré xD


Una vez más te agradezco los documentos y toda la ayuda, de verdad, muchas gracias !!
En línea

Mi algoritmo en PHP (estupideces y más).
Código
  1. while($Se_feliz){
  2.  Piensa_un_OBJETIVO(); // Sin excusas!
  3.  if($Tienes_un_objetivo){
  4.    Suspira(); // Sé paciente.
  5.    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
  6.      //RETURN; ¿O volvemos a empezar?
  7.    }else{
  8.      Inténtalo_de_nuevo();
  9.    }
  10.  }
  11. }
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Usar enum con combobox.
« Respuesta #5 en: 29 Julio 2018, 13:53 »

Disculpa la tardanza.

¿Por qué es necesario poner (RiotSharp.Misc.Region) antes del enum?

Se pone antes del enum por que esa es la sintáctica de C# necesaria para llevar a cabo la conversión de tipos, aunque ya sé que no te refieres a eso, pero recuerda que aunque la enum sea del tipo enumerado RiotSharp.Misc.Region, la función Enum.Parse() devuelve un valor de tipo object, por ende debes castear el valor devuelto al tipo de la enum, es decir de object a RiotSharp.Misc.Region, y por eso debes escribir (RiotSharp.Misc.Region) antes del enum, bueno, no es estrictamente necesario ya que puedes usar var, pero ya expliqué la confusión que el uso de var puede causar y por eso te mostré las dos formas de hacer lo mismo...

Este tipo de dudas se resuelven mejor estudiando los conceptos básicos del lenguaje y practicando, que preguntando.



Citar
Por cierto, he visto que la lista del enum tiene un orden que no me gusta, digamos A C B y quisiera A B C, así que pensé en buscar el source del enum y cambiarlo a mi manera

La solución más directa sería esa, pero ten en cuenta que en una enum cada nombre tiene asignado un valor numérico ya sea por declaración explícita (ej. A=1, C=2, B=3) o implícita (ej. A, C, B), así que si cambias el orden original de los nombres en el código fuente y si el autor hace conversiones de números a esa enum esperando cierto valor (que tu habrías cambiado de posición al reordenar la enum) entonces podrías acabar estropeando el funcionamiento de algo...

Lo más simple y seguro es que utilices cualquier funcionalidad de ordenación como podría ser Array.Sort():

Código
  1. string[] names = Enum.GetNames(typeof(KnownColor));
  2. Array.Sort(names);
  3.  
  4. foreach (string name in names) {
  5.  Console.WriteLine(name);
  6. }

o puedes usar LINQ si fuese necesario especificar el orden ascendente o descendente de ordenación:

Código
  1. IOrderedEnumerable<string> names =
  2.    from string name in Enum.GetNames(typeof(KnownColor))
  3.    orderby name descending
  4.    select name;
  5.  
  6. foreach (string name in names) {
  7.  Console.WriteLine(name);
  8. }

(cosa que también puedes reproducir en el primer ejemplo llamando primero a Array.Sort() y luego a Array.Reverse())

Supongo que para cuando leas mi respuesta ya habrás resuelto el problema de la ordenación de un modo u otro, de lo contrario te sugiero que para la próxima vez trates de buscar en Google por términos clave como podrían ser para este caso: "sort array in C#"

Saludos
« Última modificación: 29 Julio 2018, 14:25 por Eleкtro » En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda con Enum
Programación Visual Basic
SheKeL_C$ 1 1,258 Último mensaje 19 Diciembre 2008, 01:10
por seba123neo
[error] costantes enum en c++
Programación C/C++
dani__ 7 4,057 Último mensaje 22 Junio 2010, 14:25
por [L]ord [R]NA
Acerca de los tipos Enum
Programación Visual Basic
x64core 5 2,966 Último mensaje 20 Septiembre 2011, 18:26
por x64core
Enum y operadores (noob)
Programación C/C++
_niu 2 1,163 Último mensaje 20 Diciembre 2011, 19:54
por _niu
Enum
Programación C/C++
angeljonh 3 934 Último mensaje 21 Agosto 2017, 20:10
por angeljonh
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines