2014-09-26 94 views
3

在我的MVC 4應用程序中,我在尋找optgroup for dropdownlist,發現this非常有幫助。Optgroup在MVC中的下拉列表4

我遵循的步驟,並實現了很好,但我目前面臨的一些issues.My控制器代碼如下所示:

Model.ddlProject = db.Projects.OrderBy(t => t.Type) 
        .Select(t => new GroupedSelectListItem 
        { 
         GroupName = t.Type, 
         Text = t.Name, 
         Value = SqlFunctions.StringConvert((decimal)t.Id) 
         }); 

分組都是在這裏完成,但我想它在不同的manner.With這我能夠下拉綁定如下圖所示:

enter image description here

現在讓我告訴我的桌子structure.I有一個表結構如下:

enter image description here

在這裏,我有一個層次結構,客戶 - >客戶端 - >項目。因此,我需要按客戶端,使得所有的項目應在clients.I下所列想是這樣的:

enter image description here

因此,我一直在堅持與查詢在這裏,查詢來實現這一。我需要在組名中顯示所有的客戶名稱,對於我需要列出所有相關項目的客戶。我想我對我的要求很清楚。許多人被困在這裏,所以任何幫助都會很棒。提前感謝。

+0

你真的應該考慮重組你的數據庫表。項目和客戶是兩件不同的事情。您應該有一個客戶端表和一個單獨的Project表,其中包含一個具有外部表的客戶端列的列。 – 2014-09-26 04:55:35

+0

我想知道這種情況下,我需要不同的表,但我不應該改變數據庫結構。所以有沒有任何可能的方式實現這個沒有數據庫change.Thanks你的快速反應。 – Saroj 2014-09-26 05:00:02

+0

可能不是。我無法看到任何分組數據的方式。您可以創建自己的類來表示層次結構,並循環遍歷每行以分配值,但爲什麼要麻煩。只需正確創建你的數據庫。 – 2014-09-26 05:53:07

回答

1

As Stephen Muecke在評論部分中表示項目和客戶是兩個不同的東西。您應該有一個客戶端表和一個單獨的Project表,其中包含一個具有外部表的客戶端列的列。因此下面的解決方案是根據您現有的表結構。

僞架構

DECLARE @clientprj TABLE ([id] int identity(1,1), [name] varchar(30), Desc1 varchar(30), ParentId int, pType varchar(30)); 

INSERT @clientprj ([name], Desc1, ParentId, pType) VALUES ('client1', '', 0, 'clt'), ('prj1', '', 1, 'prj'), ('prj2', '', 1, 'prj'), ('client2', '', 0, 'clt'), ('prj n', '', 4, 'prj') 

,這裏是查詢

SELECT GroupName, GroupKey, ProjName, ProjId 
FROM 
(
    (
     SELECT NAME AS GroupName 
      ,Id AS GroupKey 
     FROM @clientprj m 
     WHERE ParentId = 0 
     ) m 
    FULL OUTER JOIN 
    (
     SELECT NAME AS ProjName 
      ,Id AS ProjId 
      ,ParentId 
     FROM @clientprj 
    ) 
    t ON m.GroupKey = t.ParentId 
) 
WHERE ParentId <> 0 

它會返回下面的輸出。

GroupName GroupKey ProjName ProjId 
client1  1   prj1   2 
client1  1   prj2   3 
client2  4   prj n   5 

,並調用該查詢你這樣的控制器方法 -

Model.ddlProject = db.NewMethod 
        .Select(t => new GroupedSelectListItem 
        { 
         GroupName = t.GroupName, 
         GroupKey = t.GroupKey.ToString(), 
         Text = t.ProjName, 
         Value = t.ProjId.ToString() 
         }); 

,然後綁定你的下拉列表。祝你好運...