【问题标题】:Filter DataGridView through textbox and stored procedure通过文本框和存储过程过滤 DataGridView
【发布时间】:2019-08-09 11:07:41
【问题描述】:

我有一个通过存储过程填充的 DataGridView。我希望能够通过在文本框中输入来过滤 DataGridView,但我对 C# 很陌生,所以我很难弄清楚如何让它工作。

我有一个存储过程,它从我的数据库中的两个表中获取数据,它运行这个查询:

    SELECT l.LocationID,
            l.LocationName,
            g.GameName
    FROM dbo.Locations l 
    JOIN dbo.Games g
        ON g.GameID = l.GameID
    ORDER BY l.LocationName

我的 Windows 窗体应用程序使用以下代码填充 DataGridView:

public static void fillLocations(DataGridView dgv)
        {
            using (SqlConnection con = new SqlConnection("Server = (local); Database = DBName; Integrated Security = SSPI;"))
            {
                using (DataTable dt = new DataTable())
                {
                    try
                    {
                        con.Open();

                        using (SqlCommand cmd = new SqlCommand("sGetLocations", con))
                        {
                            cmd.CommandType = CommandType.StoredProcedure;

                            using (SqlDataAdapter da = new SqlDataAdapter())
                            {
                                da.SelectCommand = cmd;
                                da.Fill(dt);

                                dgv.DataSource = dt;
                                dgv.Columns[0].HeaderText = "ID";
                                dgv.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
                                dgv.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                                dgv.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
        }

我想在我的表单上有两个文本框,这样我就可以通过搜索游戏名称或位置名称来过滤 DataGridView。理想情况下,当在文本框中输入位置或游戏名称时,它会过滤结果以仅显示具有该名称的位置或游戏,但我不确定使用我的代码实现此目的的最佳方法是什么。

编辑

我现在修改了我的存储过程,以按游戏或位置参数进行过滤

    SELECT l.LocationID,
            l.LocationName,
            g.GameName
    FROM dbo.Locations l 
    JOIN dbo.Games g
        ON g.GameID = l.GameID
    WHERE g.GameName LIKE '%' + @GameName + '%'
    OR l.LocationName LIKE '%' + @LocationName + '%'

我还为我的搜索文本框编写了一个在 TextChanged 事件上调用的不同方法

 public static void filterLocations(DataGridView dgv, TextBox tloc, TextBox tgam)
        {
            using (SqlConnection con = new SqlConnection("Server = (local); Database = BoneFish; Integrated Security = SSPI;"))
            {
                using (DataTable dt = new DataTable())
                {
                    try
                    {
                        con.Open();

                        using (SqlCommand cmd = new SqlCommand("sFilterLocations", con))
                        {
                            cmd.CommandType = CommandType.StoredProcedure;
                            cmd.Parameters.AddWithValue("@LocationName", tloc.Text);
                            cmd.Parameters.AddWithValue("@GameName", tgam.Text);

                            using (SqlDataAdapter da = new SqlDataAdapter())
                            {
                                da.SelectCommand = cmd;
                                da.Fill(dt);

                                dgv.DataSource = dt;
                                dgv.Columns[0].HeaderText = "ID";
                                dgv.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
                                dgv.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
                                dgv.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells;
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }
            }
        }

运行应用程序时我没有收到任何错误,但在搜索文本框中输入时没有任何反应。

【问题讨论】:

    标签: c# sql-server


    【解决方案1】:

    您需要在存储过程中设置 N 个参数(与过滤列相同)

    代码 C#:

        SqlCommand command = new SqlCommand(commandText, connection);
        command.Parameters.Add("@ID", SqlDbType.Int);
        command.Parameters["@ID"].Value = customerID;
    

    还有sql:

        SELECT l.LocationID,
            l.LocationName,
            g.GameName
    FROM dbo.Locations l 
    JOIN dbo.Games g
        ON g.GameID = l.GameID
    WHERE g.GameName like '%' + @GameNameParam + '%'
    ORDER BY l.LocationName
    

    更多信息: https://docs.microsoft.com/en-en/dotnet/api/system.data.sqlclient.sqlcommand.parameters?view=netframework-4.8

    周末愉快!

    【讨论】:

    • 感谢鲁本的帮助。我已经使用您的建议进行了一些更改,但它没有按预期工作。我已经用新代码和详细信息更新了我的问题,想知道您是否有任何想法?
    猜你喜欢
    • 2013-01-31
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 2014-07-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多