none
[VB2005]請教一個關於DataGridView的設技技巧 RRS feed

  • 問題

  • 首先感謝各位大大熱心幫忙,想請教一個關於DataGridView的問題?

    我建立了產品Product以及供應商Supplier的DataTable在DataSet 裏,

    Product裏有ProductID, ProductName, SupplierID,

    而 Supplier 裏則是 SupplierID, SupplierName,

    並且有ProductBindingSource及SupplierBindingSource

    並在Form中建立了一個DataGridView,將DataGridView的DataSorce指到

    Product,在DataGridView裏也建立了一個SupplierDataGridViewComboBoxColumn,他的DataPropertyName是

    Product的SupplierID,而DataSource是SupplierBindingSource,

    而DisplayMember以及ValueMember是SupplierName以及SupplierID,

    Form開啟後,我希望當使用者在Form最上方的一個TextBox輸入時,

    能自動過濾他要的資料,比如他在產品名稱打XXX,

    那ProductBIndingSource.Filter = "ProductName Like '%" & TextBox.Text & "%'"

    到這邊為止應是沒什麼問題,但是如果使用者想用供應商名稱當過濾條件時,

    我該怎麼做呢?因為ProductBindingSource並沒有SupplierName可以當過濾條件,

    想請教大家都是如何做的?

    之前我在 VB.NET 2003裏,我是用Select 敘述先產生DataTable,

    如"SELECT Product.ProductID, Product.ProductName, Product.SupplierID, Supplier.SupplierName FROM Product INNER JOIN Supplier ON Product.SupplierID = Supplier.SupplierID"

    產生後,再去使用 Filter的功能,不過當時 VB 的DataGrid只有TextBox以及CheckBox,

    並沒有ComboBox,而目前 VB2005已經有ComboBox的功能,如用ComboBox的話,

    我原本的Filter功能該怎麼寫比較好!

    2006年8月9日 上午 06:45

解答

  • tihs大大,我已將Products資料表的記錄全部讀到應用程式了, 要依據使用者指定的各種條件(包括ProductName或SupplierName)過濾Products記錄之後再顯示。

    我有想到一個方法,的確是可以,但是蠻雜的。

    方法如下:

    Dim dvSupplier as DataView = SupplierDataTable.DefaultView

    用DataView的 RowFilter 將使用者輸入的SupplierName過濾出來

    dvSupplier.RowFilter = "SupplierName Like '%" TextBox.Tex "%'"

    For i as interger  = 0 to dvSupplier.Count - 1

        If i = 0 Then

            ProductBindingSource.Filter = "SupplierID = '" & dvSupplier.rows(i)("SupplierID") & "'"

        Else

           ProductBindingSource.Filter += " Or SupplierID = '" & dvSupplier.rows(i)("SupplierID") & "'"

        End If

     Next

    這樣最後就會把 ProductBindingSource 用 SupplierName 過濾出來了,不過 ProductBindingSource的 Filter 真的很長!

    2006年8月11日 上午 03:44

所有回覆

  • HI,

    基本上您還是可以依據SupplierID過濾Products資料表的記錄, 要把Suppliers資料表的欄位顯示在GridView控制項中的ComboBox欄位和執行的過濾應該沒有關係, 換句話說, 根據使用者輸入的條件過濾好的記錄顯示到GridView控制項會視ComboBox欄位的屬性設定自動呈現結果

    tihs

    2006年8月9日 上午 09:11
  • 感謝您的說明,小弟想使用的是 SupplierName來過澽條件,卻不能在 Product裏下ProductBindingSource.Filter = "SupplierName = ''",因為用 SupplierName卻不在ProductBindingSource裏,這卻苦惱了小弟!

    >>根據使用者輸入的條件過濾好的記錄顯示到GridView控制項會視ComboBox欄位的屬性設定自動呈現結果

    您這段話意思是說我應該設定SupplierBindingSource.Filter = "SupplierName = '" & TextBox.Text & "'"

    Sorry, 這句話有點不太懂!

    2006年8月9日 上午 09:24
  • HI,

    我的意思是您還是可以利用SupplierID來過濾Products資料表的記錄, 但是您可以使用ComboBox讓使用者設定過濾條件, 因為您的ComboBox控制項DataSource是SupplierBindingSource,而DisplayMember以及ValueMember是SupplierName以及SupplierID,所以ComboBox控制項顯示的就已經是Supplier的CompanayName了, 您只要執行以下的過濾條件:

    SELECT Product.ProductID, Product.ProductName, Product.SupplierID, Supplier.SupplierName FROM Product INNER JOIN Supplier ON Product.SupplierID = " & ComboBox控制項名稱.SelectedValue

    使用者可以依據所挑選的供應商公司名稱過濾出所需要的產品記錄, 不太能體會您的問題在那裏?

    tihs

    2006年8月10日 上午 05:17
  • tihs 大大,真的很感謝您的回覆。

    小弟的意思是當資料已經透過 TableAdapter 的 Fill 方法,傳到 Form 時,這時侯該怎麼設計會比較好過濾?

    原本我也有設一個 FillBySupplierName 的方法,讓使用者每次查詢時都到主機上去Select 資料。

    但是因為商品有幾萬種,所以每次使用者如果要過濾條件時,都得到DBServer去 Select 資料出來,

    速度就變得有點慢。所以在這個 Form 上,我是先把 Product 裏的資料都 Select 出來,

    然後再讓使用者去點選(ComboBox)他要用什麼條件過濾資料,比如他點選 ProductName,

    接著,當他在TextBox上打下他要過濾的文字時,就會執行 ProductBindingSource.Filter = "ProductName Like '%" & TextBox.Text & "%'"

    由於 DataGridView 的 DataSource 是 ProductBindingSource,所以使用者就可以看到 DataGridView 裏的資料,都是符合他輸入的過澽條件,

    但是我不曉得怎麼做的就是如何讓使用者能用SupplierName來過濾?

    我發問的文章內容裏有下了一段 SQL 敘述,

    "SELECT Product.ProductID, Product.ProductName, Product.SupplierID, Supplier.SupplierName FROM Product INNER JOIN Supplier ON Product.SupplierID = Supplier.SupplierID"

    好像要這樣子才能使用 ProductBindingSource 的 Filter ,

    所以小弟是想問,還有其他的方式可以過濾的嗎?

    2006年8月10日 上午 05:49
  • HI,

    我有點不太清楚, 您現在的資料庫中有Suppliers資料表和Products資料表, 現在是Products資料表的記錄很多, 但是Suppliers資料表的記錄不多, 而您希望在程式中依據使用者指定的各種條件(包括ProductName或SupplierName)到資料庫查詢Products資料表的記錄, 這樣對嗎? 還是您已將Products資料表的記錄全部讀到應用程式中了, 然後要依據使用者指定的各種條件(包括ProductName或SupplierName)過濾Products記錄之後再顯示?

    tihs

     

     

    2006年8月11日 上午 03:32
  • tihs大大,我已將Products資料表的記錄全部讀到應用程式了, 要依據使用者指定的各種條件(包括ProductName或SupplierName)過濾Products記錄之後再顯示。

    我有想到一個方法,的確是可以,但是蠻雜的。

    方法如下:

    Dim dvSupplier as DataView = SupplierDataTable.DefaultView

    用DataView的 RowFilter 將使用者輸入的SupplierName過濾出來

    dvSupplier.RowFilter = "SupplierName Like '%" TextBox.Tex "%'"

    For i as interger  = 0 to dvSupplier.Count - 1

        If i = 0 Then

            ProductBindingSource.Filter = "SupplierID = '" & dvSupplier.rows(i)("SupplierID") & "'"

        Else

           ProductBindingSource.Filter += " Or SupplierID = '" & dvSupplier.rows(i)("SupplierID") & "'"

        End If

     Next

    這樣最後就會把 ProductBindingSource 用 SupplierName 過濾出來了,不過 ProductBindingSource的 Filter 真的很長!

    2006年8月11日 上午 03:44
  •  tihs大大您好:
           剛好遇到一個難題,延續這個問題~
     如果我資料正好是特殊字..如" 堃" 或 "綉" 
     下查詢語法sql 時, 一般都下  SupplierName  like N'% " & TextBox.Text & "%'"
     如果是用DataView的 RowFilter 要過濾像這樣特殊字..不知道要怎麼下呢?


    abc
    2009年3月2日 上午 06:51