2016-02-04 159 views
0

我正在製作一個程序,其中用戶可以將成員添加到數據網格視圖,編輯該網格中的成員並刪除成員。我可以很容易地添加成員,但是當我想要過濾DataGridView結果(默認爲名爲'MembersTable'的表中的所有數據)時,我的問題就會到來,以便用戶可以編輯特定數據而無需搜索整個表結果。通過SQL查詢過濾DataGridView表

以下是稱爲「成員類」

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。

回答

1

當我需要篩選我的datagridview時,我在columnheader下創建了一個文本框。 然後,我捕捉到適當的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

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

} 
+0

這正是我一直在尋找的。除了部分「where row.id」以外,我幾乎能夠以任何方式將這些代碼重新分配給我自己的代碼。在這種情況下,'id'是什麼?非常感謝你。 – Alex

1

在的WinForms我使用bindingSourceSqlDataAdapter填補表的所有數據。

例子:

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

然後過濾,我使用TextChanged事件上textboxdateTimepicker控制器,則不需要再次提出請求到數據庫:

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

Thi s示例按名稱過濾網格。

編輯: 而且您還需要連接bindingSourceDataGridView

dgView->DataSource = bindingSource;