DropDownListにバインドしたデータとは別に「選択してください」とか「全て」とかいった非バインドデータを追加したいことがある。
この場合の処理で参考書とかによく掲載されているのが
AppendDataBoundItemsプロパティを使う方法だ。しかし、実際の現場で使うときに非常に困った現象が起きる場合がある。
今回はその例と回避方法を紹介する。
DropDownListコントロールを単独で使う場合では問題は起きない。
どういう状況で起きるかといえば、データベースのリレーションによる階層(関連)データを絞り込む場合である。
下図サンプルは、OrderテーブルのOrderIDがCustomerIDとEmployeeIDによって絞り込まれる様子である。
1.DropDownListの標準使用では条件にあった件数(この場合は2件)分のデータがリストに追加される。(左DropDownList)
2.AppendDataBoundItemsを有効にした場合、2セット(4件)重複して追加されてしまう。(中央DropDownList)
これはページロード時に、CustomerIDのDropDownListとEmployeeIDのDropDownListにデータがバインドされる度にOrderIDのDropDownListに連動されてバインドが実行され、さらに自分自身がバインドした結果だと思う。
これを回避する方法はいろいろ試した結果、AppendDataBoundItemsプロパティを使わずに
3.Item.InsertメソッドをDataBoundイベントの中で実行する方法である。(右DropDownList)
余分に追加することがないように条件をつけてある。

※画面は合成したもの
'--上記2の処理--
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Load
If Not IsPostBack Then
ddlOrder.Items.Clear()
ddlOrder.Items.Add(New ListItem("全て", ""))
ddlOrder.AppendDataBoundItems = True
End If
End Sub
'--上記3の処理--
Private Sub ddlOrder2_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles ddlOrder2.DataBound
If ddlOrder2.Items.Count = 0 Or _
(ddlOrder2.Items.Count > 0 AndAlso ddlOrder2.Items(0).Text <> "全て") Then
ddlOrder2.Items.Insert(0, New ListItem("全て", ""))
End If
End Sub
posted by なっちゃん at 13:51| 静岡 ☁|
Comment(0)
|
TrackBack(0)
|
ASP.NET Tips
|

|