【问题标题】:Bind DataGridView to multiple tables将 DataGridView 绑定到多个表
【发布时间】:2011-08-08 11:05:24
【问题描述】:

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

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

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

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

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

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

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

这可以自动完成吗?您将如何将表绑定到 Datagrid? (我知道数据绑定对于单个表/视图是如何工作的,但是在这种情况下我不知道该怎么做)

也欢迎对设计提出任何意见。

编辑澄清:表格被简化,有更多字段,其中一个 ID 号作为主键,查询将受到其他参数的限制,因此只有少数成分会被列出。我主要想知道如何在数据网格或类似 UI 中呈现这样的表格设计,从而最大限度地减少开发工作。

【问题讨论】:

  • 从 UI 的角度来看,如果成分的数量很大,这将是笨拙的。如果存在其他选项,通常要避免水平滚动。您是否考虑过在主表中选择配方并在详细表中编辑成分值的主从表对?
  • 表格有点简化,有一个额外的条件适用成分,因此列数是有限的。此外,用户应该能够看到两个收件人之间的差异,而无需单击它们。

标签: c# .net database-design


【解决方案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* 代表你自己的存储过程。

【讨论】:

  • 为什么关联表需要额外的ID?我使用 (RecName_ID, Ingredient_ID) 作为键。这也强制每个成分只出现一次。 AmountType 表的好主意,虽然我的应用程序不需要它。
  • @grimmig ID 代表该关联。当我研究一些深入的数据库时,我总是建议我的学生创建额外的 ID。只是想知道他们当时真正属于哪个协会。我同意乍一看似乎有点没用的观点。
猜你喜欢
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多