Usar enum con combobox.

Iniciado por #Aitor, 13 Julio 2018, 22:46 PM

0 Miembros y 1 Visitante están viendo este tema.

#Aitor

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 (vb.net) [Seleccionar]
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
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

Eleкtro

#1
Cita de: #Aitor en 13 Julio 2018, 22:46 PMLa 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:




Cita de: #Aitor en 13 Julio 2018, 22:46 PM
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 (csharp) [Seleccionar]
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








#Aitor

Cita de: Eleкtro en 15 Julio 2018, 11:11 AM
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 (vb.net) [Seleccionar]
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 (vb.net) [Seleccionar]
   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 (vb.net) [Seleccionar]

' Espero que no te haga daño a la vista...
api.GetSummonerByName(t, Name.Text);
api.GetSummonerByName(RiotSharp.Misc.Region t, Name.Text);
api.GetSummonerByName(RiotSharp.Misc.Region.t, Name.Text);
api.GetSummonerByName(RiotSharp.Misc.Region(Enum.Parse(typeof(RiotSharp.Misc.Region), comboBox1.SelectedValue.ToString())), Name.Text);


Y nada, que no dejo de comerme la cabeza y que siento la torpeza...
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

Eleкtro

#3
Cita de: #Aitor en 15 Julio 2018, 16:46 PMAhora 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 (csharp) [Seleccionar]
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 (csharp) [Seleccionar]
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 (csharp) [Seleccionar]
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








#Aitor

Cita de: Eleкtro en 15 Julio 2018, 18:05 PM

Código (csharp) [Seleccionar]
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...?)


Cita de: Eleкtro en 15 Julio 2018, 18:05 PM
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 !!
Mi algoritmo en PHP (estupideces y más).
Código (php) [Seleccionar]
while($Se_feliz){
  Piensa_un_OBJETIVO(); // Sin excusas!
  if($Tienes_un_objetivo){
    Suspira(); // Sé paciente.
    if($Consigues_el_objetivo){ echo "¡Felicidades #Aitor!";return;
      //RETURN; ¿O volvemos a empezar?
    }else{
      Inténtalo_de_nuevo();
    }
  }
}

Eleкtro

#5
Disculpa la tardanza.

Cita de: #Aitor en 16 Julio 2018, 00:23 AM¿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.




CitarPor 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 (csharp) [Seleccionar]
string[] names = Enum.GetNames(typeof(KnownColor));
Array.Sort(names);

foreach (string name in names) {
  Console.WriteLine(name);
}


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

Código (csharp) [Seleccionar]
IOrderedEnumerable<string> names =
   from string name in Enum.GetNames(typeof(KnownColor))
   orderby name descending
   select name;

foreach (string name in names) {
 Console.WriteLine(name);
}


(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