0

我有一个网格视图和表格。我在互联网上搜索过,但找不到如何在数据库中存储多个复选框选择(MS Access)......实际上我想在联结表中存储技能的 ID 以建立多对多关系..你能帮助我...谢谢

<Columns>
     <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" ReadOnly="True" SortExpression="ID" />
     <asp:BoundField DataField="Skills" HeaderText="Skills" SortExpression="Skills" />
     <asp:TemplateField HeaderText="Select">
           <ItemTemplate>
               <asp:CheckBox ID="chkSelect" runat="server"  />
            </ItemTemplate>
     </asp:TemplateField>
</Columns>
4

1 回答 1

0

恕我直言,最好的方法是尝试将数据转换为控件期望的形式。我不是一个访问人员 - Access 可以有视图和存储过程吗?

我将在面向数据库的方法中执行此操作,因为这就是我今天的感受,但是基于 C# 的方法将与此非常相似。

我将为一般 SQL 回答这部分,但您可能需要更多特定于域的人来弄清楚如何在 Access 中执行此操作。假设您有两个表:SkillType 和 PersonH​​asSkill。SkillType 将是全球技能列表(编码、写作、僵尸杀戮),PersonH​​asSkill 将是你的人和你的技能之间的关系(Fred 有编码和僵尸杀戮)。

针对您的 SkillType 创建一个与 Person 交叉连接的视图。这将创建一个视图,显示人员和技能类型的所有可能组合。然后我们对 PersonH​​asSkill 进行外连接,它实际上定义了这种技能和人员的特定组合是否确实存在 - 在这种情况下,我们认为 PersonH​​asSkill 列将为空。因此,我们检查该 Null 值并将其用于我们视图中的一列,该列告诉我们此 PersonH​​asSkill 事物是否为真。

在大多数 SQL 语言中,这类似于

CREATE VIEW SkillView
SELECT Person.PersonID
, SkillType.*
, CASE WHEN PersonHasSkill.SomeColumn IS NULL THEN 0 ELSE 1 END AS HasSkill
FROM SkillType
CROSS JOIN Person
LEFT OUTER JOIN PersonHasSkill 
  ON SkillType.SkillTypeID = PersonHasSkill.SkillTypeID     
  AND PersonHasSkill.PersonID = Person.PersonID

将它用于您的 AccessDataSource 的选择目标。如果您愿意,可以使用 proc 代替视图。或者跳过视图并将其直接放入 AccessDataSource 的选择正文中,而不使用“CREATE VIEW”部分和“WHERE”子句。任何。

使用 <%# Eval %> 语法进行实际绑定。请参阅http://msdn.microsoft.com/en-us/library/ms178366.ASPX

您实际上不能为此使用 GridView 提供的预烘焙更新逻辑,因为这些更新逻辑是为一次执行一行而不是整个表而设计的。所以我们将跳过#Bind 双向方法而只使用#Eval 单向方法。

简而言之,您希望绑定到数据值的控件字段,您将控件字段设置为等于 '<%# Eval("HasSkill)" #>' - 使用单引号,因为您必须使用双引号 -绑定表达式中的引号。

那么对于你的情况?

        <ItemTemplate>
           <asp:CheckBox ID="chkSelect" runat="server" Checked='<# Eval("HasSkill") />
        </ItemTemplate>

现在我们有了表格中的数据。

为了更新?真糟糕,我们必须在代码隐藏中完成所有工作。您可以访问复选框的状态来进行更新……您的更新并不是真正的更新。如果复选框为“false”,您将从 UserHasSkill 表中删除,如果复选框为 TRUE,您将插入...并且您必须检查该行是否已存在于 UserHasSkill 表中,所以事情不会爆炸。要获取复选框的状态,请执行

ForEach(GridViewRow row in MyGridView.Rows)
{
  if (row.RowType == DataControlRowType.DataRow) //avoid header/footer rows.
  {
    var myCheckBox = (CheckBox)row.FindControl("chkSelect");
    //myCheckBox.Checked tells you if it's checked or not, yay!
    var myPrimaryKey = (GuidOrIntOrSomething)MyGridView.DataKeys[row.RowIndex].Value;
    //now you have your Key and the checkbox for whether the user has checked it 
    //and you can do your update/insert/delete/whatever against the DB.
  }
}

如果您想在决定是否删除/插入之前避免从数据库中读取每个字段,您可以将旧获取的结果保存到 ViewState 中,以便以后使用。这是一个小列表,因此不会破坏 ViewState。

所以,是的,真的很简单。

于 2013-11-06T16:01:50.367 回答