Dónde debo de colocar el .Clear();

Iniciado por irvincnt93, 30 Abril 2015, 03:34 AM

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

irvincnt93

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 (csharp) [Seleccionar]


public Form5()
       {
           InitializeComponent();
       }
       DataSet ds = new DataSet();
       private void Form5_Load(object sender, EventArgs e)
       {
           cargarActas2("");
           loadComboPeriodo();
           loadComboDepartamento();
           loadComboMate();
           loadComboProfesor();
           loadComboTipoSemestre();
       }
       
       public void cargarActas2( String Filtro )
       {

           
           string connetionString = "Data Source=IRONGIO-PC;Initial Catalog=itiz;Integrated Security=True";
           string sql = "select idacta, PE.nombrePeriodo, DE.nombreDpto, MA.nombreMateria, PR.nombreProfesor, TS.nombreTipoSemestre, grupo, clave, folio, ruta" +
                                  " from Actas A" +
                                  " join Periodos PE on A.idperi = PE.idperi" +
                                  " join Departamentos DE on A.iddpto = DE.iddpto" +
                                  " join Materias MA on A.idmate = MA.idmate" +
                                  " join Profesores PR on A.idprofe = PR.idprofe" +
                                  " join TipoSemestre TS on A.idtiposem = TS.idtiposem WHERE 1=1 " + Filtro ;

           SqlConnection conexion = new SqlConnection(connetionString);
           SqlDataAdapter dataAdap = new SqlDataAdapter(sql, conexion);
           conexion.Open();
           dataAdap.Fill(ds);
           conexion.Close();
           
           dgvActas.DataSource = ds.Tables[0];

       }

       private void Filtar_Click(object sender, EventArgs e)
       {
           
           String Filtro="";

           if (comboBox4.SelectedIndex != 0)
           {
               Filtro += " and  A.idperi= " + comboBox4.SelectedValue.ToString();
               ds.Clear();
           }
           if (comboBox1.SelectedIndex != 0)
           {    
               Filtro = " and A.iddpto = " + comboBox1.SelectedValue.ToString();
               ds.Clear();

           }
           if (comboBox3.SelectedIndex != 0)
           {
               Filtro += " and  A.idmate= " + comboBox3.SelectedValue.ToString();
               ds.Clear();
               
           }
           if (comboBox2.SelectedIndex != 0)
           {
               Filtro += " and  A.idprofe= " + comboBox2.SelectedValue.ToString();
               ds.Clear();
               
           }
           if (comboBox5.SelectedIndex != 0)
           {
               Filtro += " and  A.idtiposem= " + comboBox5.SelectedValue.ToString();
               ds.Clear();
               
           }

           this.cargarActas2(Filtro);
           

       }

private void MostrarTodo_Click(object sender, EventArgs e)
       {
           ds.Clear();
           cargarActas2("");
           
       }

private void Limpiar_Click(object sender, EventArgs e)
       {
           comboBox1.Text = "";
           comboBox2.Text = "";
           comboBox3.Text = "";
           comboBox4.Text = "";
           comboBox5.Text = "";
           ds.Clear();
           
       }


Eleкtro

#1
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 (csharp) [Seleccionar]
if (ComboBox.SelectedIndex != 1) {
   // ...
}


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 (csharp) [Seleccionar]
ComboBox1.SelectedItem = Nothing;
o también:
Código (csharp) [Seleccionar]
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 (csharp) [Seleccionar]
...
ds.Clear();
dataAdap.Fill(ds);
...


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 (vbnet) [Seleccionar]
   Private filterList As New List(Of String)

   Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
   Handles MyBase.Load

       ' Set property names as tags
       Me.ComboBox1.Tag = "iddpto"
       Me.ComboBox2.Tag = "idprofe"
       Me.ComboBox3.Tag = "idmate"
       Me.ComboBox4.Tag = "idperi"
       Me.ComboBox5.Tag = "idtiposem"

   End Sub

   Private Sub ComboBox_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) _
   Handles ComboBox1.SelectedIndexChanged,
           ComboBox2.SelectedIndexChanged,
           ComboBox3.SelectedIndexChanged,
           ComboBox4.SelectedIndexChanged,
           ComboBox5.SelectedIndexChanged

       Dim cb As ComboBox = DirectCast(sender, ComboBox)

       Me.filterList.Remove(Me.filterList.Find(Function(item As String) item Like String.Format("AND A.{0}*", cb.Tag.ToString)))

       If cb.SelectedIndex <> -1 Then
           Me.filterList.Add(String.Format("AND A.{0}='{1}'", cb.Tag.ToString, cb.SelectedItem.ToString))
       End If

#If DEBUG Then
       Debug.WriteLine(String.Join(" ", Me.filterList))
#End If

   End Sub


Traducción a C#:
Código (csharp) [Seleccionar]

private List<string> filterList = new List<string>();

private void Form1_Load(object sender, EventArgs e) {

// Set property names as tags
this.ComboBox1.Tag = "iddpto";
this.ComboBox2.Tag = "idprofe";
this.ComboBox3.Tag = "idmate";
this.ComboBox4.Tag = "idperi";
this.ComboBox5.Tag = "idtiposem";
}

// nota: Este event-handler lo usas para suscribirte al evento 'SelectedIndexChanged' de TODOS los ComboBoxes.
private void ComboBox_SelectedIndexChanged(object sender, EventArgs e) {

ComboBox cb = (ComboBox)sender;
       this.filterList.Remove(this.filterList.Find((string item) => item.StartsWith(string.Format("AND A.{0}", cb.Tag.ToString))))

if (cb.SelectedIndex != -1) {
this.filterList.Add(string.Format("AND A.{0}='{1}'", cb.Tag.ToString, cb.SelectedItem.ToString));
}

// #if DEBUG
    Debug.WriteLine(string.Join(" ", this.filterList));
// #endif
}


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

Saludos