0

チェックボックスを使用していくつかのテーブル値を更新する必要があります。テーブルは、id、name、selected (bool) の 3 つの単純な列で構成されます。

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

問題は明らかです。値が設定されていません....しかし、なぜですか?

テスト目的で、まったく同じ SqlDataSource を使用して GridView を追加しました。「編集」リンク、チェックボックス、「更新」リンクの順にクリックしてレコードを変更できます。それだけで、データベースに保存され、更新コマンドが 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

null の代わりに "False" と "0" を送信していることがわかりますが、ID はまだ "null" として送信されています。

そのため、パラメーターを変更して、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 チェックボックス列

このような単純なクエリには DataSet.xsd を使用でき、その簡単なドラッグ アンド ドロップ オブジェクトでデータベース クエリを作成できます。

于 2013-10-14T21:11:36.143 に答える