es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El cuadro de texto de la función de búsqueda no funciona correctamente en c#.

Mi código:

private void txtSearch_TextChanged(object sender, EventArgs e)
{
if (txtSearch.Text == “”)
{
DGViewListItems.Rows.Clear();
populateTable();
}
else
{
if (byItemcode.Checked == true)
{
DGViewListItems.Rows.Clear();
using (SqlConnection con = db.Connect())
{
try
{
//estos MessageBox son solo para pruebas. para comprobar si los datos son correctos
MessageBox.Show(“‘” + STEntry.whseFr.Text.Trim() + “‘”);
MessageBox.Show(“‘” + txtSearch.Text.Trim() + “‘”);
SqlDataReader rd;
SqlCommand cmd = new SqlCommand(“sp_WhseItemsList”, db.Connect());
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue(“@Action”, “I”);
switch (activeform.formname)
{
case “Issuance List”:
//cmd.Parameters.AddWithValue(“@WHSE”, STEntry.whseFr.Text);
break;

                            case "Stocks Transfer List":
                                cmd.Parameters.AddWithValue("@WHSE", STEntry.whseFr.Text.Trim());
                                break;

                            case "Stocks Adjustment List":
                                cmd.Parameters.AddWithValue("@WHSE", SADJEntry.txtWhse.Text.Trim());
                                break;
                        }
                        cmd.Parameters.AddWithValue("@Desc", "");
                        cmd.Parameters.AddWithValue("@Itemcode", '%' + txtSearch.Text.Trim() + '%');
                        rd = cmd.ExecuteReader();
                        int i = 0;
                        if (rd.HasRows)
                        {
                            while (rd.Read())
                            {
                                DGViewListItems.Rows.Add();
                                DGViewListItems.Rows[i].Cells["itemcode"].Value = rd["itemcode"].ToString();
                                DGViewListItems.Rows[i].Cells["whsecode"].Value = rd["whsecode"].ToString();
                                DGViewListItems.Rows[i].Cells["description"].Value = rd["description"].ToString();
                                DGViewListItems.Rows[i].Cells["uom"].Value = rd["uom"].ToString();
                                DGViewListItems.Rows[i].Cells["quantity"].Value = rd["quantity"].ToString();
                                i++;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                    }
                }
            }
            else if (byDescription.Checked == true)
            {

            }
        }
    }

Esto no funciona para mí, porque no completa el dgv correctamente. No creo que la consulta sea el problema dentro del procedimiento almacenado, porque probé la consulta manualmente y funciona bien.

La consulta que probé:

SELECT DISTINCT A.*, B.description, B.uom
FROM inventoryTable A
LEFT OUTER JOIN Items B
ON A.itemcode = B.itemcode WHERE (A.whsecode = ‘WHSE1’ AND A.itemcode LIKE ‘%S%’);

La salida:

Y aquí está la salida para el código en el evento TextChanged:

Aquí hay más ejemplo de salida:

Este es el contenido del procedimiento almacenado como referencia:

ALTER PROCEDURE [dbo].[sp_WhseItemsList]
@Action char(5) = ”,
@WHSE char(15) = ”,
@Desc varchar(50) = ”,
@Itemcode char(15) = ”
AS
BEGIN
— SET NOCOUNT ON se agregó para evitar resultados adicionales de
— interferir con las declaraciones SELECT.
SET NOCOUNT ON;

IF @Action = 'A'
    BEGIN
        SELECT DISTINCT A.*, B.description, B.uom 
        FROM inventoryTable A  
        LEFT OUTER JOIN Items B 
        ON A.itemcode = B.itemcode WHERE A.whsecode = @WHSE;
    END

IF @Action = 'I'
    BEGIN
        SELECT DISTINCT A.*, B.description, B.uom 
        FROM inventoryTable A  
        LEFT OUTER JOIN Items B 
        ON A.itemcode = B.itemcode WHERE (A.whsecode = @WHSE) AND (A.itemcode LIKE @Itemcode);
    END

IF @Action = 'D'
    BEGIN
        SELECT DISTINCT A.*, B.description, B.uom 
        FROM inventoryTable A  
        LEFT OUTER JOIN Items B 
        ON A.itemcode = B.itemcode WHERE (A.whsecode = @WHSE) AND (B.description LIKE @Desc);
    END

END

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Problema al poblar DataGridView en C# y SQL

    El código no está poblando correctamente el DataGridView, a pesar de que la consulta usada en el procedimiento almacenado funciona correctamente. Por lo tanto, el problema reside en el código en sí mismo.

    En el evento txtSearch_TextChanged, se está verificando la condición byItemCode y ejecutando una consulta SQL. Sin embargo, al agregar las filas al DataGridView, los nombres de columna no se están estableciendo correctamente. Esto podría estar causando el problema de que los datos no se muestren como se espera.

    Además, hay una sección de código comentada donde el parámetro @WHSE se establece en función del nombre del formulario activo. Esto podría causar problemas si el formulario elegido no coincide con ninguna de las condiciones case. Es mejor establecer explícitamente el valor del parámetro @WHSE en lugar de comentar el código.

    Para solucionar el problema, revisar los nombres de columna agregados al DataGridView y asegurarse de que coincidan con la declaración select en el procedimiento almacenado. Además, considerar establecer explícitamente el valor del parámetro @WHSE en lugar de confiar en el código comentado.

    Sugerencias de Mejora

    • Usar consultas parametrizadas para evitar ataques de inyección SQL.
    • Usar el registro para capturar cualquier error que ocurra en el bloque catch.
    • Refactorizar el código para separar las operaciones de la base de datos y las actualizaciones de la interfaz de usuario en métodos separados para mejorar la mantenibilidad y legibilidad del código.

Comments are closed.