将DataGridView绑定到多个表

时间:2011-04-19 07:45:07

标签: c# .net database-design

我的数据库中有以下三个表,我希望在单个DataGridView中向用户显示:

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

用户应该看到每个RecipeName占一行,配方名称是第一列,而成分命名以下列。每个单元格将包含recipeValue的数量,每个食谱都包含每种成分。此外,用户必须能够通过添加新行来编辑任何单元格添加新配方。应该是这样的:

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

目前我正在考虑手动生成和填充网格:

  • 为成分表中的每一行添加列
  • 为RecipeNames中的每个名称添加行
  • 根据RecipeValue表填充单元格

然后用户可以在表格中添加/修改内容。当他点击“保存”按钮时,我再次遍历数据网格,并为每一行执行适当的更新/插入操作。

这可以自动完成吗?如何将表绑定到Datagrid? (我知道数据绑定如何适用于单个表/视图,但在这种情况下如何处理却不知道)

欢迎对设计发表任何评论。

编辑以澄清:表格是简化的,还有更多字段,其中ID号作为主键,查询将受到其他参数的限制,因此只有少数成分会被列出。我主要想知道在数据网格或类似的UI中呈现这样的表格设计的方法,这使得开发工作保持最小化。

1 个答案:

答案 0 :(得分: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是因为不同的类型:

  • 茶匙
  • tablespoon
  • 介质

等等。

在此之后,现在回到您的问题,首先,您为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 *代表您自己的存储过程。