【问题标题】:ASP.NET C# gridview Store the checkbox value in access from Grid ViewASP.NET C# gridview 将复选框值存储在从网格视图访问中
【发布时间】:2013-11-06 13:06:50
【问题描述】:

我有一个网格视图和表单。我在互联网上搜索过,但找不到如何将多个复选框选择存储在数据库中(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>

【问题讨论】:

  • 一个建议,将 db 中复选框的 id 存储为字符串。

标签: c# asp.net gridview


【解决方案1】:

恕我直言,最好的方法是尝试将数据转换为控件期望的形式。我不太擅长访问 - 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”子句。随便哪一个。

使用 语法进行实际绑定。见http://msdn.microsoft.com/en-us/library/ms178366.ASPX

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

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

那么你的情况呢?

        <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。

是的,真的很简单。

【讨论】:

    猜你喜欢
    • 2015-01-22
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2011-03-02
    • 1970-01-01
    相关资源
    最近更新 更多