按SQL查询筛选DataGridView表

时间:2016-02-04 09:30:26

标签: c# sql winforms datagridview

我正在制作一个程序,用户可以在其中将成员添加到数据网格视图,编辑该网格中的成员并删除成员。我能够轻松地添加成员,但是当我想要过滤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相对较新。

3 个答案:

答案 0 :(得分:1)

当我需要过滤我的datagridview时,我在columnheader下创建一个textBox。 然后,我捕获相应的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值的数据。

我希望它有所帮助。

答案 1 :(得分:1)

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();
        }
    }

} 

答案 2 :(得分:1)

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

示例:

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

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

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;