我的数据库中有以下三个表,我希望在单个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 |
目前我正在考虑手动生成和填充网格:
然后用户可以在表格中添加/修改内容。当他点击“保存”按钮时,我再次遍历数据网格,并为每一行执行适当的更新/插入操作。
这可以自动完成吗?如何将表绑定到Datagrid? (我知道数据绑定如何适用于单个表/视图,但在这种情况下如何处理却不知道)
欢迎对设计发表任何评论。
编辑以澄清:表格是简化的,还有更多字段,其中ID号作为主键,查询将受到其他参数的限制,因此只有少数成分会被列出。我主要想知道在数据网格或类似的UI中呈现这样的表格设计的方法,这使得开发工作保持最小化。
答案 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是因为不同的类型:
等等。
在此之后,现在回到您的问题,首先,您为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 *代表您自己的存储过程。