2011-04-19 88 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