Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按SQL查询筛选DataGridView表_C#_Sql_Winforms_Datagridview - Fatal编程技术网

C# 按SQL查询筛选DataGridView表

C# 按SQL查询筛选DataGridView表,c#,sql,winforms,datagridview,C#,Sql,Winforms,Datagridview,我正在制作一个程序,用户可以在其中向数据网格视图添加成员,编辑该网格中的成员并删除成员。我可以很容易地添加成员,但当我想过滤DataGridView结果(默认为名为“MembersTable”的表中的所有数据)时,问题就出现了,这样用户就可以编辑特定的数据,而不必搜索整个表的结果 下面是名为“MemberClass”的类中的方法 public static List<MemberClass> SearchMember(string MemberIdentifier) { us

我正在制作一个程序,用户可以在其中向数据网格视图添加成员,编辑该网格中的成员并删除成员。我可以很容易地添加成员,但当我想过滤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;
}
公共静态列表搜索成员(字符串成员标识符)
{
正在使用(SqlConnection=newsqlconnection(_connectionstring))
{
列表成员列表=新列表();
//连接打开
connection.Open();
string sqlQuery=string.Format(“从MembersTable中选择*,其中MemberID='{0}',MemberIdentifier);
SqlCommand SearchFormMember=新的SqlCommand(sqlQuery,连接);
SqlDataReader SqlDataReader=SearchFormMember.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();
//连接关闭
返回成员列表;
}
在我的主屏幕表单中,我使用按钮后面的以下代码根据用户输入的数据(在本例中为MemberID)搜索结果

List <MemberClass> MemberList = MemberClass.SearchMember(textBox1.Text);
List MemberList=MemberClass.SearchMember(textBox1.Text);
我的问题是,如何过滤DataGridView框的结果,以仅显示由上述代码和用户输入的MemberID过滤的结果


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

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

这是我的VB.NET代码,但它可能会帮助您理解

我使用
数据绑定

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
过滤器子模块:

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值的数据


我希望这会有所帮助。

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

这是我的VB.NET代码,但它可能会帮助您理解

我使用
数据绑定

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
过滤器子模块:

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值的数据

希望对你有所帮助。

VB.NET到C#

从VB.NET到C#


在WinForms中,我使用
bindingSource
SqlDataAdapter
用所有数据填充表格

例如:

SqlDataAdapter^ dataAdapter = gcnew SqlDataAdapter("SELECT * FROM    table",connection);
        connection->Open();
        DataTable^ table = gcnew DataTable();
        dataAdapter->Fill(table);
        bindingSource->DataSource = table;
然后使用
textbox
dateTimepicker
控制器上的
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;
}
此示例按名称筛选网格

编辑: 您还需要将
bindingSource
连接到
DataGridView

dgView->DataSource = bindingSource;

在WinForms中,我使用
bindingSource
SqlDataAdapter
用所有数据填充表格

例如:

SqlDataAdapter^ dataAdapter = gcnew SqlDataAdapter("SELECT * FROM    table",connection);
        connection->Open();
        DataTable^ table = gcnew DataTable();
        dataAdapter->Fill(table);
        bindingSource->DataSource = table;
然后使用
textbox
dateTimepicker
控制器上的
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;
}
此示例按名称筛选网格

编辑: 您还需要将
bindingSource
连接到
DataGridView

dgView->DataSource = bindingSource;

这正是我所寻找的。除了“where row.id”部分外,我几乎可以以任何方式将此代码重新设置为我自己的代码。在此上下文中,“id”是什么?非常感谢。这正是我所寻找的。我几乎可以以任何方式将此代码重新设置为我自己的代码,除了“where row.id”部分“。在这种情况下,“id”是什么?非常感谢。