2011-04-19 92 views
1

我有我的數據庫中以下三個表,我想在一個DataGridView中顯示給用戶:DataGridView的綁定到多個表

RecipeNames  RecipeValue   Ingredient 
-----------  -------------  ---------- 
PK Name  FK RecipeName  
       FK IngredientName PK Name 
        Amount 

用戶應該看到每RecipeName中一行,配方名稱是第一列,組分命名爲以下列。每個單元格將包含一個配方值的數量,每個配方具有每種配料。此外,用戶必須能夠通過添加新行來編輯任何單元格添加新配方。應該是這樣的:

Name  | Ingredient 1 | ... | Ingredient n | 
----------------------------------------------- 
Recipe1 | 100   | ... | 1000   | 
Recipe2 | 200   | ... | 2000   | 

在我正想着生成和手動灌裝電網這樣的時刻:

  • 添加列的每一行的成分表
  • 添加行了在RecipeNames每個名稱根據RecipeValue表

  • 填充細胞,然後用戶可以添加/修改表中的東西。當他點擊一個「保存」按鈕時,我再次遍歷數據網格,併爲每一行進行適當的更新/插入操作。

    這可以自動完成嗎?你如何將表綁定到Datagrid? (我知道數據綁定對於單個表格/視圖是如何工作的,但是在這種情況下我不知道怎麼做)

    對設計的任何評論都是值得歡迎的。

    編輯澄清:表格被簡化,他們有更多的字段,其中一個ID號作爲主鍵,查詢將受到其他參數的限制,以便只列出幾個成分。我主要想知道如何在數據網格或類似的用戶界面中呈現這樣的表格設計,從而保持最小的開發工作量。

  • +1

    從用戶界面的角度來看,如果配料的數量很大,這將是笨拙的。如果存在其他選項,水平滾動通常是避免的。您是否考慮過在主表中選擇主配方並在細節表中編輯配料值的主配置表對? – nycdan 2011-04-19 07:50:32

    +0

    這些表格有點簡化,這是一個額外的條件,適用的成分,所以列數是有限的。此外,用戶應該能夠看到兩個收件人之間的差異,而不用點擊它們。 – grimmig 2011-04-19 08:15:52

    回答

    1

    請不要將字符串作爲主鍵或外鍵使用?這是非常糟糕的做法,如果你正在使用MSSQL(我猜)你正在關閉服務器的速度。

    tblRecipeNames AsRecipeValue  tblIngredients tblAmountTypes 
    -----------  -------------  ----------  ---------- 
    PK ID   PK ID    PK ID    PK ID 
        Name   FK RecName_ID   Name    Name 
           FK Ingredient_ID 
           FK AmountType 
            Amount 
    

    我重命名了您的RecipeValue,因爲此表是「關聯表」,所以這就是「As」的來源。我還爲每張桌子添加了ID,因爲這是您應該使用的。

    新表AmountTypes是因爲不同的類型:

    • 茶匙
    • 湯匙
    • 媒體
    • 熱情

    等等。

    之後,現在回到你的問題,首先你爲你的getter和setter生成存儲過程。您希望將SQL Server作爲您獲取信息的「硬盤驅動器」,因爲它是處理數據的最快方式。

    例如:

    SELECT * FROM tblRecipeNames 
         INNER JOIN AsRecipeValue ON tblRecipeNames.ID = AsRecipeValue.RecName_ID 
         INNER JOIN tblIngredients ON tblIngredients.ID = AsRecipeValue.Ingredient_ID 
    

    這是第一步驟。如果你在那裏,你可以一個SqlDataSource添加到您的GridView和在現場你把你的存儲過程是這樣的控制:

    <asp:SqlDataSource ID="sqlSrc" runat="server" InsertCommand="spInsert" DeleteCommand="spDelete" UpdateCommand="spUpdate" /> 
    

    SP *代表你自己的存儲過程。

    +0

    爲什麼關聯表的額外ID?我正在使用(RecName_ID,Ingredient_ID)作爲關鍵字。這也強制每個成分只出現一次。 AmountType表的好主意,儘管它在我的應用程序中不需要。 – grimmig 2011-04-19 09:06:20

    +0

    @grimmig ID代表該關聯。當我正在研究一些深層數據庫的東西時,我總是建議我的學生創建額外的ID。只是想知道他們到底在哪個協會。我同意第一眼看起來似乎有點無用的觀點。 – wegginho 2011-04-19 10:09:51