我正在制作一个程序,用户可以在其中将成员添加到数据网格视图,编辑该网格中的成员并删除成员。我能够轻松地添加成员,但是当我想要过滤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相对较新。
答案 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中,我使用bindingSource
和SqlDataAdapter
来填充表格中的所有数据。
示例:
SqlDataAdapter^ dataAdapter = gcnew SqlDataAdapter("SELECT * FROM table",connection);
connection->Open();
DataTable^ table = gcnew DataTable();
dataAdapter->Fill(table);
bindingSource->DataSource = table;
然后要过滤我在TextChanged
和textbox
控制器上使用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;
}
此示例按名称过滤网格。
编辑:
您还需要将bindingSource
与DataGridView
联系起来。
dgView->DataSource = bindingSource;