繁体   English   中英

ASP.NET C#gridview将复选框值存储在从Grid View的访问中

[英]ASP.NET C# gridview Store the checkbox value in access from Grid View

我有一个gridview和窗体。 我已经在Internet上进行搜索,但是找不到如何在数据库中存储多个复选框选择(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>

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

我将以一种面向数据库的方法进行此操作,因为这就是我今天的感觉,但是有些基于C#的方法与此非常相似。

我将针对通用SQL回答这一部分,但您可能需要更多特定于域的人员来弄清楚如何在Access中进行操作。 假设您有两个表:SkillType和PersonH​​asSkill。 SkillType将是全球最大的技能列表(编码,写作,僵尸杀伤),而PersonH​​asSkill将是您的员工与您的技能之间的关系(Fred具有编码和僵尸杀伤)。

针对与Person交叉连接的SkillType创建视图。 这将创建一个视图,该视图显示人员和技能类型的每种可能组合。 然后,我们对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。

是的,真的很简单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM