0

我需要使用复选框更新一些表值。该表由 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 属性。现在错误消息是:

“输入字符串的格式不正确。”

我认为这应该是一种从“当前”复选框项中获取基础值的方法,但我不知道为什么,我仍在寻找示例。

4

2 回答 2

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; }
}

这是在更新语句中打开的调试器。所有数值都是准确的!

调试

显然还有很大的改进空间,但希望这能让您对如何进行有一个好主意!

于 2013-10-09T20:39:31.023 回答
0

确保您的 ID 列是唯一的(键 + 自动编号),这样您的“WHERE”将仅引用 ID 列,而“SET”将引用 true\false 列(您检查的列)。

UPDATE [dbo].[Table_1] 
SET  [CheckBoxCol] = @CheckBoxCol 
WHERE (([id] = @Original_id))

为了捕捉“Checked”事件,您可以使用以下参考: ASP.NET 2.0 Gridview CheckBox column How to add event for Checkbox click in Asp.net Gridview Column

您可以将 DataSet.xsd 用于此类简单查询,它可以轻松拖放对象来创建数据库查询。

于 2013-10-14T21:11:36.143 回答