恕我直言,最好的方法是尝试将数据转换为控件期望的形式。我不是一个访问人员 - Access 可以有视图和存储过程吗?
我将在面向数据库的方法中执行此操作,因为这就是我今天的感受,但是基于 C# 的方法将与此非常相似。
我将为一般 SQL 回答这部分,但您可能需要更多特定于域的人来弄清楚如何在 Access 中执行此操作。假设您有两个表:SkillType 和 PersonHasSkill。SkillType 将是全球技能列表(编码、写作、僵尸杀戮),PersonHasSkill 将是你的人和你的技能之间的关系(Fred 有编码和僵尸杀戮)。
针对您的 SkillType 创建一个与 Person 交叉连接的视图。这将创建一个视图,显示人员和技能类型的所有可能组合。然后我们对 PersonHasSkill 进行外连接,它实际上定义了这种技能和人员的特定组合是否确实存在 - 在这种情况下,我们认为 PersonHasSkill 列将为空。因此,我们检查该 Null 值并将其用于我们视图中的一列,该列告诉我们此 PersonHasSkill 事物是否为真。
在大多数 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。
所以,是的,真的很简单。