簡體   English   中英

Asp.Net CheckBoxList更新SqlDataSource

[英]Asp.Net CheckBoxList to update a SqlDataSource

我需要使用復選框更新一些表值。 該表由3個簡單列組成:id,name和selected(布爾)。

我向表單添加了一個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。 我將“名稱”和“所選”列的參數源設置為屬性“ 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 source設置ID,然后選擇CheckboxList,然后將Selected設置為SelectedValue屬性。 現在錯誤消息是:

“輸入字符串的格式不正確。”

我認為這應該是從“當前”復選框項中獲取基礎值的一種方法,但是我不知道為什么,我仍在尋找示例。

我做了一個中繼器構造,看起來像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; }
}

這是在更新語句中打開的調試器。 所有值都是准確的!

除錯

顯然還有很多改進的余地,但是希望這會給您一個如何進行的好主意!

確保您的ID列是唯一的(鍵+自動編號),這樣您的“ WHERE”將僅引用ID列,而“ SET”將引用true \\ false列(您檢查的列)。

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

為了捕獲“已檢查”事件,可以使用以下引用: ASP.NET 2.0 Gridview CheckBox列 如何為Checkbox添加事件,請在Asp.net Gridview列中單擊。

您可以使用DataSet.xsd進行此類簡單查詢,使用其易拖放對象創建數據庫查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM