【问题标题】:Filtering DataGridView Winforms过滤 DataGridView Winforms
【发布时间】:2015-11-03 18:16:24
【问题描述】:

我正在尝试创建一个按钮,该按钮接受 2 个用户输入,然后根据两个输入过滤 datagridview。我正在使用winforms和Sql。这是我找到并尝试实现的一些代码,但它没有使用过滤后的数据填充 datagridview。

        private void button3_Click(object sender, EventArgs e) {
        dataSet31.Personal_Details.Clear();
        using (SqlDataAdapter sqlDataAdapter =
new SqlDataAdapter(sqlCommand2.CommandText = "select * from Personal_Details WHERE '" + comboBox2 + "' LIKE '" + textBox1 + "'",
    "Data Source=Z46308;Initial Catalog=VSTest;Integrated Security=True"))
        {
            using (DataTable dataTable = new DataTable())
            {
                sqlDataAdapter.Fill(dataTable);
                this.DataGridView01.DataSource = dataTable;
            }
        }
    }

【问题讨论】:

  • 如果您在表单加载中加载数据,那么您不需要运行查询来过滤网格,您可以简单地使用DataView 来过滤数据表。
  • 上述方法可以更好地扩展 - 这意味着如果 Personal_Details 包含 100,000 条记录,则加载 DataView 需要很长时间。

标签: c# winforms datagridview


【解决方案1】:

如果您在表单加载中加载数据,那么您不需要运行查询来过滤网格,您可以简单地使用DataView 来过滤数据表。

在下面的示例中,我假设您使用 comboBox2 来选择您想要过滤的列名。

//Create a data table to store data when you load them in form load
private DataTable dataTable;
private void Form1_Load(object sender, EventArgs e)
{
    dataTable = new DataTable();
    string constring = @"Data Source=Z46308;Initial Catalog=VSTest;Integrated Security=True";
    using (SqlConnection con = new SqlConnection(constring))
    {
        using (SqlDataAdapter sda = new SqlDataAdapter("select * from Personal_Details", con))
        {
            //Fill the data table here
            sda.Fill(dataTable);
        }
    }
    //Set the data source of grid
    this.DataGridView01.DataSource = new DataView(dataTable);
}
private void button3_Click(object sender, EventArgs e)
{
    //Get the datasource from grid
    var dv = (DataView)this.DataGridView01.DataSource;

    //comboBox2.SelectedItem or comboBox2.SelectedValue based on your settings
    //Apply filter to data source
    dv.RowFilter = string.Format("{0} Like '%{1}%'",comboBox2.SelectedItem,   textBox1.Text);
}

编辑

您也可以使用this.DataGridView01.DataSource = dataTable;设置数据源,然后在过滤时只需使用dataTable.DefaultView.RowFilter = ....

【讨论】:

  • 这很好用,谢谢。由于我是初学者,如果您能抽出一些时间来解释每行的作用,我将不胜感激。谢谢
  • 为什么要创建一个新的 DataView 对象?你也可以使用 DataTable.DefaultView 对吧?
  • @danish 我创建了它而不是 BindingSource,但你是对的。虽然答案可以正常工作,但可以在不创建 DataView 实例的情况下编写它。
  • 我不确定您是否使用 dataAdapter 加载数据,它会将记录添加到表中,但如果您愿意,您可以 dataTable=new DataTable() 然后使用 sda.Fill(dataTable); 填充它,然后将其设置为 DataSource再次网格this.DataGridView01.DataSource = new DataView(dataTable);
  • 我明白你的意思,你可以dataTable=new DataTable(); 作为你加载数据的方法的第一行,就像我在回答中所做的那样(我编辑了答案)。
【解决方案2】:

您不需要一直在数据库上运行查询。这是另一种方法。

您可以使用DataView.RowFilter 属性来过滤内存中的数据。完成此操作后,您可以将数据重新绑定到网格。假设数据表对象名称为table,这就是您可以在按钮单击时执行的操作。

        table.DefaultView.RowFilter = combobox1.SelectedText + " LIKE '%" + textbox1.Text + "%'";
        dataGridView1.DataSource = null;
        dataGridView1.DataSource = table.DefaultView;

【讨论】:

  • 感谢您的评论 +1 :)
【解决方案3】:

尝试将 comboBox2 更改为 comboBox2.SelectedValue 并将 textBox1 更改为 textBox1.Text。 我认为查询不会以您目前的方式返回任何结果。

我在我的应用程序中使用了类似的东西,看看我的代码,看看你是否可以调整它以满足你的需求:

SqlCommand cmd = new SqlCommand("SELECT o.OrderID AS ID,o.ProductID AS ProductID, p.ProductName AS 'ProductName', s.CompanyName AS Supplier, c.CategoryName AS Category, o.UnitPrice AS 'Unit Price', o.Quantity AS Quantity, (o.UnitPrice * o.Quantity) AS 'Sub-Total'" +
          "FROM [Order Details] o INNER JOIN Products p ON o.ProductID = p.ProductID " +
          "INNER JOIN Suppliers s ON p.SupplierID = s.SupplierID INNER JOIN Categories c ON p.CategoryID = c.CategoryID WHERE OrderID = '" + DropDownList1.SelectedValue + "'", new SqlConnection(ConfigurationManager.ConnectionStrings["databaseConnection1"].ConnectionString));
    cmd.Connection.Open();
    SqlDataReader sdrEmp = cmd.ExecuteReader();
    try
    {
        if (sdrEmp.HasRows)
        {
            DataTable dt = new DataTable();
            dt.Load(sdrEmp);
            //Response.Write(dt);
            ViewState["CurrentTable"] = dt;
            dataGridView1.DataSource = dt;
            dataGridView1.DataBind();        // BIND DATABASE TABLE WITH THE GRIDVIEW.
        }
    }

【讨论】:

  • 我错过了。那是我的错,但我仍然没有结果?
  • 裸奔,我只是一个菜鸟,但我有2个错误。当前上下文中不存在ViewState,Datagridview中没有Databind的定义?
  • 我认为您可以删除这两行: ViewState["CurrentTable"] = dt;和 dataGridView1.DataBind() 你还需要在你的 Web.Config 中添加一个连接字符串
  • 这是一个 Windows 窗体应用程序。这里没有 ViewState 的概念。
【解决方案4】:
 private void button2_Click(object sender, EventArgs e)
    {
        //dataSet31.Personal_Details.Clear();
        SqlCommand cmd = new SqlCommand();
        using (SqlDataAdapter sqlDataAdapter =
new SqlDataAdapter(cmd.CommandText = "select * from vtypes WHERE VoucherType ='" + comboBox1.Text + "' AND VouOrder = '" + textBox1.Text + "'",
    "Data Source=SQLEXPRESS;Initial Catalog=DB50A0;Integrated Security=True"))
        {
            using (DataTable dataTable = new DataTable())
            {
                sqlDataAdapter.Fill(dataTable);
                this.dataGridView1.DataSource = dataTable;
            }
        }
    }

【讨论】:

    猜你喜欢
    • 2020-10-23
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多