【问题标题】:Filter DataGridView Table by SQL Query按 SQL 查询筛选 DataGridView 表
【发布时间】:2016-05-13 20:09:49
【问题描述】:

我正在制作一个程序,其中用户可以将成员添加到数据网格视图,编辑该网格中的成员并删除成员。我可以很容易地添加成员,但是当我想要过滤 DataGridView 结果(默认为名为“MembersTable”的表中的所有数据)以便用户可以编辑特定数据而无需搜索时,我的问题就出现了整个表格的结果。

下面是一个名为'MemberClass'的类中的方法

public static List<MemberClass> SearchMember(string MemberIdentifier)
{
    using (SqlConnection connection = new SqlConnection(_connectionstring))
    {
        List<MemberClass> MemberList = new List<MemberClass>();

        //connection open
        connection.Open();

        string sqlQuery = string.Format("SELECT * FROM MembersTable WHERE MemberID = '{0}'", MemberIdentifier);

        SqlCommand searchForMember = new SqlCommand(sqlQuery, connection);

        SqlDataReader sqlDataReader = searchForMember.ExecuteReader();

        while (sqlDataReader.Read())
            {
                MemberClass newMemberClass = new MemberClass((int)sqlDataReader["MemberID"], (string)sqlDataReader["FirstName"], (string)sqlDataReader["LastName"], (string)sqlDataReader["MemberAddress"], (string)sqlDataReader["TypeOfMembershipID"], (string)sqlDataReader["PhoneNumber"], (DateTime)sqlDataReader["MembershipStart"], (DateTime)sqlDataReader["MembershipEnd"], (string)sqlDataReader["Notice"], (string)sqlDataReader["TypeOfPaymentID"]);
                MemberList.Add(newMemberClass);
            }
    connection.Close();
    //connection close

    return MemberList;
}

在我的主屏幕表单中,我使用按钮后面的以下代码根据用户输入的数据(在本例中为 MemberID)搜索结果。

List <MemberClass> MemberList = MemberClass.SearchMember(textBox1.Text);

我的问题是,如何过滤DataGridView框的结果,只显示上面代码过滤的结果和用户输入的MemberID?

抱歉我的无知,我对 DataGridView 比较陌生。

【问题讨论】:

    标签: c# sql winforms datagridview


    【解决方案1】:

    当我需要过滤我的数据网格视图时,我会在列标题下创建一个文本框。 然后,我捕获了相应的 textBox.TextChanged 事件,并使用第二个查询重新加载了我的 datagridview,这是带有 WHERE 子句的默认查询。

    这是我的 VB.NET 代码,但它可能有助于您理解。

    我使用dataBinding

    Private WithEvents datasBindingSource As New BindingSource()
    

    txtChanged 事件:

    Private Sub txtfilterMemberID_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtfilterMemberID.TextChanged
        filterDatas()
    End Sub
    

    过滤子:

    Private Sub filterDatas()
        ListObjets = _dao.YourQuery
        datasBindingSource.DataSource = ListObjets
        dtg.DataSource = datasBindingSource
    
        Dim query =
        From row In ListObjets
        Where row.MemberID.ToString.Contains(txtfilterMemberID.Text) 
        Select row
    
        If query.Count > 0 Then
            If ListObjets.Count = query.Count Then
                datasBindingSource.DataSource = ListObjets
            Else
                datasBindingSource.DataSource = query
            End If
        Else
            MessageBox.Show("No data found !")
            If txtfilterMemberID.Focused = True Then
                txtfilterMemberID.ResetText()       
        End If
    End Sub
    

    Row.MemberID 是您需要过滤的列。 filterDatas 方法将遍历所有数据,并且仅显示列中包含 txtBox.Text 值的数据。

    希望对你有所帮助。

    【讨论】:

      【解决方案2】:

      VB.NET 到 C#

       private void filterDatas()
      {
          dynamic query = from row in ListObjets where row.id.ToString.Contains(txtBoxId.Text) select row;
      
          if (query.Count > 0)
          {
              if (ListObjets.Count == query.Count)
              {
                  datasBindingSource.DataSource = ListObjets;
              }
              else {
                  datasBindingSource.DataSource = query;
              }
          }
          else {
              MessageBox.Show("No data found!");
              if (txtBoxId.Focused == true)
              {
                  txtBoxId.ResetText();
              }
          }
      
      } 
      

      【讨论】:

      • 这正是我想要的。除了“where row.id”部分之外,我几乎可以通过各种方式将这段代码重新分配给我自己。在这种情况下,“id”是什么?非常感谢。
      【解决方案3】:

      在 WinForms 中,我使用 bindingSourceSqlDataAdapter 用所有数据填充表格。

      例子:

      SqlDataAdapter^ dataAdapter = gcnew SqlDataAdapter("SELECT * FROM    table",connection);
              connection->Open();
              DataTable^ table = gcnew DataTable();
              dataAdapter->Fill(table);
              bindingSource->DataSource = table;
      

      然后过滤我在textboxdateTimepicker 控制器上使用TextChanged 事件,您不需要向数据库发送另一个请求:

      buildFilter = "";
      filterBuilder(this->tName->Text,"`Name`");
      bindingSource->Filter = buildFilter;
      

      构建器看起来像这样:

      void OverView::filterBuilder(String^ txt,String^ Column_name){
          if(!txt->Equals(""))
          {
              if(!buildFilter->Equals("")){
                  buildFilter = buildFilter+ " AND ";
              }
              buildFilter = buildFilter + Column_name +" LIKE '*"+ txt + "*'";
          }
          buildFilter = buildFilter;
      }
      

      此示例按名称过滤网格。

      编辑: 您还需要将bindingSourceDataGridView 连接起来。

      dgView->DataSource = bindingSource;
      

      【讨论】:

        猜你喜欢
        • 2012-01-23
        • 1970-01-01
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        • 2015-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多