我需要使用复选框更新一些表值。该表由 3 个简单的列组成:id、name 和 selected (bool)。
我在表单中添加了一个asp:CheckBoxList控件,并将其绑定到SqlDataSource。我用简单的代码MySqlDataSource.Update ()添加了一个按钮;然后浏览到页面。
我单击一个复选框,然后单击按钮以更新数据源并使用 Sql Server Profiler 我看到这是发送到数据库的内容:
exec sp_executesql N'UPDATE [MyTable] SET [Name] = @Name, [Selected] = @Selected
WHERE [Id] = @Id',N'@Name nvarchar(4000),@Selected bit,
@Id int',@Name=NULL,@Selected=NULL,@Id=NULL
问题很清楚,没有设置值....但是为什么呢?
我添加了一个 GridView,仅用于测试目的,使用相同的 SqlDataSource 而不移动任何位置,我可以通过单击“编辑”链接、复选框和“更新”链接来修改记录就是这样,它确实保存到数据库,它正确地将更新命令发送到 Sql Server。
如果我转到 MyDataSource 的 UpdateQuery 属性,我看到有一个设置“参数源”的选项,但我在下拉列表中看不到设置同一数据源的参数源。好像我在这里遗漏了一些东西....但是为什么相同的 SqlDataSource 确实适用于 GridView ?
我已经花了几个小时搜索有关使用 CheckboxList 执行更新的示例,并且找到了很多示例,但是...大多数仅用于显示目的。我想知道 CheckboxList 是否真的可以用于更新?
更新
按照建议将参数源设置为 CheckBoxList。我将 Name 和 Selected 列的参数源设置为属性“SelectedValue”。它改变了行为,但它仍然工作错误,现在发送到数据库的查询是:
exec sp_executesql N'UPDATE [MyTable] SET [Name] = @Name, [Selected] = @Selected WHERE [Id] = @Id',N'@Name nvarchar(5),@Selected bit,@Id int',@Name=N'False',@Selected=0,@Id=NULL
您现在可以看到它发送“False”和“0”而不是空值,但 Id 仍然作为“空”发送。
因此,我更改了参数以使用 Control 类型的参数源设置 ID,然后是 CheckboxList,然后将 Selected 设置为 SelectedValue 属性。现在错误消息是:
“输入字符串的格式不正确。”
我认为这应该是一种从“当前”复选框项中获取基础值的方法,但我不知道为什么,我仍在寻找示例。