チェックボックスを使用していくつかのテーブル値を更新する必要があります。テーブルは、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 プロパティに設定しました。エラーメッセージは次のとおりです。
"入力文字列は、正しい形式ではありませんでした。"
「現在の」チェックボックス項目から基になる値を取得する方法だと思いますが、理由がわからず、まだ例を探しています。