2010-08-25 33 views
0

所以,這個問題可能有點含糊,但我經常討論它:Asp.Net GridView:好還是壞/用於綁定的數據類型?

當設計一個Asp.Net頁面時,很多時候你可能只想在頁面上拋出一個快速而髒的GridView 。當你走這條路線時,你有各種數據源選項(我通常使用ObjectDataSource綁定到一個業務對象),你也可以手動綁定。

我已經看到很多數據類型可以自動提供網格內的排序功能的變化。我已經看到人們將他們的自定義POCO集合轉化爲其業務對象中的DataTables,以便GridViews可以更輕鬆地支持這些類型的行爲。

通過自己處理所有可用事件(OnSorting,OnUpdating等),您可以真正從GridView中獲得很多不同的行爲,並且最終可以長期高度自定義。即使情況如此,您可能會遇到其他一些小問題,例如無法使用「Enter」鍵自動執行給定行的更新操作。這是因爲頁面上的默認按鈕可能不在GridView中,並且ASP.Net只允許您爲給定面板指定默認按鈕,並且不會爲GridView模板中的按鈕提供此行爲。這只是一個例子,介意你。當然,還有一個問題,就是在每次過濾操作時頁面是否應該返回到數據源,或者整個數據源是否應該緩存在頁面上的ViewState中,以允許在不訪問數據庫的情況下進行過濾/排序...

因此,這裏是最終的問題:是否有理由在您想要基本的CRUD操作的頁面上使用GridView,即使這意味着將您的自定義集合轉換爲某種DataTable? GridViews應該完全拋棄,以支持其他類似DataList,ListView或Repeater的東西嗎?後面的選項當然可能更靈活,但這是否意味着應該爲每個場景重建GridView的默認行選擇,編輯,排序等功能?

關於這個問題的任何合理的想法讚賞!

回答

1

我才意識到這個問題,仍然掛在這裏所以這裏是我對這個話題的結論:

我還是覺得嵌入一個ASP.Net頁面內的標準GridView控件是有用的。我仍然認爲在頁面的代碼隱藏中處理每個排序事件是不合理的,因爲它會導致真正的維護噩夢,並且會將您的數據交互和業務邏輯代碼過分靠近MVC術語中的「視圖」。

我不知道GridViews與各種DataSource控件的集成程度如何。我知道在給定正確的情況下,連接到SqlDataSource的GridView會在應用自己的排序和分頁技術時直接對數據庫執行各種CRUD操作,但這並不能很好地將ObjectDataSource與業務對象一起使用 - 或者如此我想。

原來在ObjectDataSource控件上有三個關鍵屬性,它允許它通過排序和分頁參數動態地爲業務對象提供一個方法。

這些屬性是:SelectCountMethod,SortParameterName,StartRowIndexParameterName和MaximumRowsParameterName。與需要EnablePaging標誌一起這些屬性更改「中選擇」方法的預期的簽名,並開始自動使用SelectCount方法得到的總記錄可能的數字返回,使用GridView的頁面大小和當前狀態,以確定在哪裏開始結果集以及要在該起點之外選擇的項目數,並開始提交SQL樣式的排序表達式以及對Select方法的所有調用。總而言之,這是一大進步,但如果您使用POCO類的自定義集合,或者針對LinqToSql或EF對象上下文執行查詢,則仍然必須將StartRowIndex和MaximumRow參數轉換爲某種形式一個跳躍的()。以()組合(這是非常簡單和明顯)和排序表達式轉換爲對你的對象上下文或內存中的集合某些類型的查詢。

我不會在這裏介紹所有冗長的細節,但基本上解決方案是使用動態Linq功能和反射來定義一個查詢表達式,以便只使用排序字符串繼續處理內存中的集合。

排序字符串將包含一個字段名和在典型的「字段名DESC」格式的排序方向(僅在降序)。通過解析此字符串,您可以使用特定類型的反射來使用Sort字符串中的匹配屬性名稱創建表達式。

這裏的主要好處是,只有少數幾個調整到選擇方法和使用自定義的LINQ擴展處理一種字符串轉換成一個lambda表達式,你可以去GridView的連接最多的您的常規業務具有構建排序功能的業務邏輯以及分頁功能。

因爲它是在原來的問題提到的,我會注意到,該解決方案將導致命中在數據庫上幾乎每一個頁面加載,但最終返回的數據量要小得多,更具有針對性。

1

剛走不得不首次在年GridView的再次使用,我想起爲什麼我沒有使用過他們這麼久。 GridView的是偉大的他們都在一個基本水平設計的,但不幸的是大部分時間的最終用戶會希望有更多的功能,而這正是他們開始功虧一簣。雖然您可以自定義和擴展網格視圖,但是正如您所指出的那樣,這會打開一整串不同的蠕蟲。所以對我來說,我嘗試堅持使用網格視圖作爲報表生成的工具。除此之外的任何事情,我似乎花費很多時間來定製和調整它,以獲得接近我需要的東西,這是不值得的努力。