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