我需要使用Checkbox更新一些表值。该表由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列的参数source设置为属性“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仍然被发送为“null”。
因此,我更改了参数,使用Control类型的Parameter源设置ID,然后使用CheckboxList,然后将Selected设置为SelectedValue属性。 现在错误消息是:
“输入字符串的格式不正确。”
我认为应该是从“当前”复选框项中获取基础值的方法,但我不知道为什么,我仍在搜索示例。
答案 0 :(得分:3)
我制作了一个看起来像asp:CheckBoxList
的转发器结构,但具有其他功能。以下是浏览器中的内容:
这是.aspx代码:
<form id="form1" runat="server">
<div>
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# (bool)Eval("Selected") %>' />
<asp:Label ID="Label1" runat="server" Text='<%# Eval("Name")%>' AssociatedControlID="CheckBox1"></asp:Label>
<div style="clear:both;height:5px;"></div>
</ItemTemplate>
</asp:Repeater>
<div style="clear:both;height:45px;"></div>
<asp:Button ID="Update_Button" runat="server" Text="Update"
OnClick="Update_Button_Click" />
</div>
</form>
代码隐藏:
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
//Fake DataTable below.
//SqlDataSource can be configured to generate a DataTable,
//Or you can use a DataAdapter
DataTable dt = new DataTable();
DataColumn dc1 = new DataColumn("Name");
DataColumn dc2 = new DataColumn("Id");
DataColumn dc3 = new DataColumn("Selected");
dc3.DataType = System.Type.GetType("System.Boolean");
dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
dt.Columns.Add(dc3);
dt.Rows.Add(new object[] { "John Doe", "135681", true });
dt.Rows.Add(new object[] { "Billy Joe", "66541", false });
dt.Rows.Add(new object[] { "Joe Shmoe", "7783654", true });
dt.Rows.Add(new object[] { "Don Sean", "1332451", true });
dt.Rows.Add(new object[] { "Moe H", "632451", false });
dt.Rows.Add(new object[] { "Clicky", "0234354", true });
//Bind DataTable to Repeater
Repeater1.DataSource = dt;
Repeater1.DataBind();
}
}
protected void Update_Button_Click(object sender, EventArgs e)
{
List<Person> Listy = new List<Person>();
ControlCollection CC = Repeater1.Controls;
foreach (RepeaterItem RI in CC)
{
Person p = new Person();
foreach (Control c in RI.Controls)
{
if (c is System.Web.UI.WebControls.CheckBox)
{
if (((System.Web.UI.WebControls.CheckBox)c).Checked)
p.Selected = true;
else p.Selected = false;
}
if (c is System.Web.UI.WebControls.Label)
{
p.Name = ((System.Web.UI.WebControls.Label)c).Text;
}
}
Listy.Add(p);
}
UpdateDatabase(Listy);
}
protected void UpdateDatabase(List<Person> L)
{
foreach (Person p in L)
{
string update = "UPDATE [Table] SET [Selected] = " + p.Selected + "WHERE [Name] = " + p.Name;
// Execute statement
}
}
}
public class Person
{
public string Name { get; set; }
//public int ID { get; set; }
public bool Selected { get; set; }
}
这是调试器在update语句中打开。所有数值都是准确的!
显然还有很大的改进空间,但希望这会让你对如何进行有所了解!
答案 1 :(得分:0)
确保您的ID列是唯一的(键+自动编号),这样您的“WHERE”将仅引用ID列,“SET”将引用true \ false列(您检查的列)。< / p>
UPDATE [dbo].[Table_1]
SET [CheckBoxCol] = @CheckBoxCol
WHERE (([id] = @Original_id))
为了捕获“Checked”事件,您可以使用以下reffs: ASP.NET 2.0 Gridview CheckBox column How to add event for Checkbox click in Asp.net Gridview Column
您可以使用DataSet.xsd进行此类简单查询,轻松拖放对象以创建数据库查询。