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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Dónde debo de colocar el .Clear();
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Dónde debo de colocar el .Clear();  (Leído 1,897 veces)
irvincnt93

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Dónde debo de colocar el .Clear();
« en: 30 Abril 2015, 03:34 am »

Hola colegas, tengo un grave problema con esta aplicaciones, bueno en si son varios problemas jeje, les comentare que es lo que hago con este pedazo de código y después cuáles son los problemas que me surgen vale.

estoy creando en C# una app Administre unas actas que guardo en imagen con diferente información como de que Periodo es, de que Departamento, de que Materia, de que Maestro y de que Tipo de semestre es, entre otros datos. En una base de datos SQL Server 2014.

el código que muestro a continuación, en el form5 cargo de forma automática la clase cargarActas(); quien me hace la conexión y la consulta como lo muestro en la clase, y así también cargo en unos combobox con cada clase que se muestra abajo en seguida, estos combos se cargan de la misma base de datos pero de otras tablas en donde tengo información con respecto al Periodo, Departamento, Materia, Profesor, TipoSemestre.

Bien, en el formulario 5 tengo un dataGridView en donde muestro toda la información y 5 combobox que importan ahorita.

cuando lo ejecuto no me genera ningún error, pero no me muestra varios resultados como deberías de mostrarme.

DE QUE SE TRATA LA APLICACIÓN

Primer "Error"
al correr la aplicación, como decía se cargan automáticamente los combobox y el datagrit con 11 filas que tengo guardado, yo puedo hacer diferentes búsquedas con la información que esta cargada en mis diferentes combos,por ejemplo si selecciono en el combo Periodo el perido Ago-Dic/2012 (que es el segundo elemento de mi combo), que me muestre todas las actas que tengo con ese periodo, esto si lo hace pero cuando hago la selección del primer elemento que esta en mi combo (que es Ago-Dic/2011), lo que me muestra es 22 elemento, osea se encima otra consulta general.  

esto se filta después de que le doy clic al boton Filtrar.

con el boton mostra, muestro una ves mas lo que esta en mi consulta, o sea todo.

con el boton eliminar, limpio todo.

Segundo ''Error''
así como en el primer error, me pasa al seleccionar el primer elemento del segundo combobox.

Mi Idea
pienso que el problema esta cuando en el ds.Clear(); en cada if que tengo.
o debo de utilizar otra método como ds.Reset();

Código
  1.  
  2. public Form5()
  3.        {
  4.            InitializeComponent();
  5.        }
  6.        DataSet ds = new DataSet();
  7.        private void Form5_Load(object sender, EventArgs e)
  8.        {
  9.            cargarActas2("");
  10.            loadComboPeriodo();
  11.            loadComboDepartamento();
  12.            loadComboMate();
  13.            loadComboProfesor();
  14.            loadComboTipoSemestre();
  15.        }
  16.  
  17.        public void cargarActas2( String Filtro )
  18.        {
  19.  
  20.  
  21.            string connetionString = "Data Source=IRONGIO-PC;Initial Catalog=itiz;Integrated Security=True";
  22.            string sql = "select idacta, PE.nombrePeriodo, DE.nombreDpto, MA.nombreMateria, PR.nombreProfesor, TS.nombreTipoSemestre, grupo, clave, folio, ruta" +
  23.                                   " from Actas A" +
  24.                                   " join Periodos PE on A.idperi = PE.idperi" +
  25.                                   " join Departamentos DE on A.iddpto = DE.iddpto" +
  26.                                   " join Materias MA on A.idmate = MA.idmate" +
  27.                                   " join Profesores PR on A.idprofe = PR.idprofe" +
  28.                                   " join TipoSemestre TS on A.idtiposem = TS.idtiposem WHERE 1=1 " + Filtro ;
  29.  
  30.            SqlConnection conexion = new SqlConnection(connetionString);
  31.            SqlDataAdapter dataAdap = new SqlDataAdapter(sql, conexion);
  32.            conexion.Open();
  33.            dataAdap.Fill(ds);
  34.            conexion.Close();
  35.  
  36.            dgvActas.DataSource = ds.Tables[0];
  37.  
  38.        }
  39.  
  40.        private void Filtar_Click(object sender, EventArgs e)
  41.        {
  42.  
  43.            String Filtro="";
  44.  
  45.            if (comboBox4.SelectedIndex != 0)
  46.            {
  47.                Filtro += " and  A.idperi= " + comboBox4.SelectedValue.ToString();
  48.                ds.Clear();
  49.            }
  50.            if (comboBox1.SelectedIndex != 0)
  51.            {    
  52.                Filtro = " and A.iddpto = " + comboBox1.SelectedValue.ToString();
  53.                ds.Clear();
  54.  
  55.            }
  56.            if (comboBox3.SelectedIndex != 0)
  57.            {
  58.                Filtro += " and  A.idmate= " + comboBox3.SelectedValue.ToString();
  59.                ds.Clear();
  60.  
  61.            }
  62.            if (comboBox2.SelectedIndex != 0)
  63.            {
  64.                Filtro += " and  A.idprofe= " + comboBox2.SelectedValue.ToString();
  65.                ds.Clear();
  66.  
  67.            }
  68.            if (comboBox5.SelectedIndex != 0)
  69.            {
  70.                Filtro += " and  A.idtiposem= " + comboBox5.SelectedValue.ToString();
  71.                ds.Clear();
  72.  
  73.            }
  74.  
  75.            this.cargarActas2(Filtro);
  76.  
  77.  
  78.        }
  79.  
  80. private void MostrarTodo_Click(object sender, EventArgs e)
  81.        {
  82.            ds.Clear();
  83.            cargarActas2("");
  84.  
  85.        }
  86.  
  87. private void Limpiar_Click(object sender, EventArgs e)
  88.        {
  89.            comboBox1.Text = "";
  90.            comboBox2.Text = "";
  91.            comboBox3.Text = "";
  92.            comboBox4.Text = "";
  93.            comboBox5.Text = "";
  94.            ds.Clear();
  95.  
  96.        }
  97.  
  98.  


« Última modificación: 30 Abril 2015, 03:41 am por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.777



Ver Perfil
Re: Dónde debo de colocar el .Clear();
« Respuesta #1 en: 30 Abril 2015, 04:50 am »

Buenas

1. Los índices empiezan por 0, si quieres determinar que haya un item seleccionado en un combobox de la manera en que lo estás haciendo entonces debes evaluar el valor -1, donde -1 es ninguno, 0 el el primer item, 1 el segundo item, etc...
Código
  1. if (ComboBox.SelectedIndex != 1) {
  2.    // ...
  3. }

2. Eliminar el texto del combobox no altera el índice de selección, el valor de la propiedad SelectedIndex seguirá siendo el mismo que estaba seleccionado antes de eliminar el texto, a menos que tengas un item vacío (una linea en blanco) y tu intención sea seleccionar ese item vacío, cosa que no has especificado.

Si lo que quieres es deseleccionar el item entonces puedes hacer:
Código
  1. ComboBox1.SelectedItem = Nothing;
o también:
Código
  1. ComboBox1.SelectedIndex = -1;

3. ¿Porque limpias el DataSet en cada comparación de cada ComboBox?, se que tienes dudas sobre eso, pero no llego a entender con que intención lo haces tantas veces seguidas, obviamente es innecesario. No me manejo con tareas que requieran el uso de SQL, pero si necesitases limpiar las filas de las tablas del dataset entonces hazlo una vez y justo antes de rellenar usando el método Fill del SQLAdapter, en el método cargarActas2:

Código
  1. ...
  2. ds.Clear();
  3. dataAdap.Fill(ds);
  4. ...

Y digo "si necesitases", por que realmente no se si es necesario ya que no he comprobado que el método Fill del SQLAdapter las limpie antes de rellenar, cabría esperar que si lo hiciese, pero repito de nuevo que no manejo SQL, si no estás seguro compruébalo por ti mismo para salir de dudas.

4. No estás respetando el buen uso de la cantidad de espacios en blanco en la query de SQL ni los valores de String que debes encerrar entre comillas, aunque repito que no manejo SQL, pero algo conozco sin haberlo llegado a usar, de todas formas toda esa maraña de ifs lo puedes simplificar para construir esa parte de la query de manera más dinámica, por ejemplo así:
 
Código
  1.    Private filterList As New List(Of String)
  2.  
  3.    Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
  4.    Handles MyBase.Load
  5.  
  6.        ' Set property names as tags
  7.        Me.ComboBox1.Tag = "iddpto"
  8.        Me.ComboBox2.Tag = "idprofe"
  9.        Me.ComboBox3.Tag = "idmate"
  10.        Me.ComboBox4.Tag = "idperi"
  11.        Me.ComboBox5.Tag = "idtiposem"
  12.  
  13.    End Sub
  14.  
  15.    Private Sub ComboBox_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) _
  16.    Handles ComboBox1.SelectedIndexChanged,
  17.            ComboBox2.SelectedIndexChanged,
  18.            ComboBox3.SelectedIndexChanged,
  19.            ComboBox4.SelectedIndexChanged,
  20.            ComboBox5.SelectedIndexChanged
  21.  
  22.        Dim cb As ComboBox = DirectCast(sender, ComboBox)
  23.  
  24.        Me.filterList.Remove(Me.filterList.Find(Function(item As String) item Like String.Format("AND A.{0}*", cb.Tag.ToString)))
  25.  
  26.        If cb.SelectedIndex <> -1 Then
  27.            Me.filterList.Add(String.Format("AND A.{0}='{1}'", cb.Tag.ToString, cb.SelectedItem.ToString))
  28.        End If
  29.  
  30. #If DEBUG Then
  31.        Debug.WriteLine(String.Join(" ", Me.filterList))
  32. #End If
  33.  
  34.    End Sub

Traducción a C#:
Código
  1. private List<string> filterList = new List<string>();
  2.  
  3. private void Form1_Load(object sender, EventArgs e) {
  4.  
  5. // Set property names as tags
  6. this.ComboBox1.Tag = "iddpto";
  7. this.ComboBox2.Tag = "idprofe";
  8. this.ComboBox3.Tag = "idmate";
  9. this.ComboBox4.Tag = "idperi";
  10. this.ComboBox5.Tag = "idtiposem";
  11. }
  12.  
  13. // nota: Este event-handler lo usas para suscribirte al evento 'SelectedIndexChanged' de TODOS los ComboBoxes.
  14. private void ComboBox_SelectedIndexChanged(object sender, EventArgs e) {
  15.  
  16. ComboBox cb = (ComboBox)sender;
  17.        this.filterList.Remove(this.filterList.Find((string item) => item.StartsWith(string.Format("AND A.{0}", cb.Tag.ToString))))
  18.  
  19. if (cb.SelectedIndex != -1) {
  20. this.filterList.Add(string.Format("AND A.{0}='{1}'", cb.Tag.ToString, cb.SelectedItem.ToString));
  21. }
  22.  
  23. // #if DEBUG
  24.     Debug.WriteLine(string.Join(" ", this.filterList));
  25. // #endif
  26. }

Haznos saber si alguna de estas correcciones o sugerencias ha corregido el problema que tienes.

Saludos


« Última modificación: 30 Abril 2015, 05:05 am 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 Sobre donde colocar post !!
Sugerencias y dudas sobre el Foro
pajo 1 2,690 Último mensaje 31 Enero 2009, 22:46 pm
por Jecth
Donde colocar el codigo javascript y los enlace a js externos?
Desarrollo Web
exploiterstack 8 3,531 Último mensaje 6 Febrero 2015, 19:17 pm
por el-brujo
Donde Debo Consultar Sobre.....
Windows
Ese28Hacker 2 2,032 Último mensaje 6 Julio 2015, 15:39 pm
por Eleкtro
No sabía donde colocar esto
Scripting
mby 1 4,113 Último mensaje 13 Septiembre 2020, 17:14 pm
por assw1208
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines