- PR -

DropDownListで現在選択行が設定できない

1
投稿者投稿内容
ハヤ
常連さん
会議室デビュー日: 2003/06/04
投稿数: 41
投稿日時: 2003-07-28 16:31
DropDownListに対して現在選択されている行を設定したいと考えています。
初期処理ではきちんと選択して欲しい行が選択されるのですが、
PostBack時には、「DropDownList には複数の項目を選択できません」という
エラーが発生してしまいまいます。

理由も回避方法も分からなくて困っています。サーバ側ではDropDownListの
選択行を設定する事は止めてJavaScriptでクライアント側でやらせなくては
ならないのでしょうか?

コード:
private void Page_Load(object sender, System.EventArgs e)
{
  if(!IsPostBack)
  {
    ListItem Li1 = new ListItem("text1","value1");
    ListItem Li2 = new ListItem("text2","value2");
    ListItem Li3 = new ListItem("text3","value3");
    
    this.DropDownList1.Items.Add(Li1);
    this.DropDownList1.Items.Add(Li2);
    this.DropDownList1.Items.Add(Li3);
    
    this.DropDownList1.Items.FindByValue("value2").Selected = true;  //これはOK
  }
}

private void Button1_Click(object sender, System.EventArgs e)
{
  this.DropDownList1.Items.FindByValue("value3").Selected = true;  //これはNG
}

cats
大ベテラン
会議室デビュー日: 2002/11/29
投稿数: 221
お住まい・勤務地: 東京
投稿日時: 2003-07-28 17:46
直前で
DropDownList1.SelectedIndex = -1;
を入れて下さい。
はぐれコ〜ギ〜
常連さん
会議室デビュー日: 2003/06/12
投稿数: 32
投稿日時: 2003-07-28 17:48
ハヤさん、こんにちわ。

つい最近、VB.NETで開発している時に同じ状況を経験してました。

Page_Load時に一度選択済アイテム(value2)を設定していますので、
ボタンクリック時にそれを解除していないと既に選択しているアイテムが存在すると
認識するようです。

ですので、当方では以下のように必要に応じて選択済アイテムを一度解除してから
選択するようにしています。
# VB.NETですので読み替えてください。
<!-- BBCode Start --><TABLE BORDER="0" ALIGN="CENTER" WIDTH="90%" CELLSPACING="0" CELLPADDING="0"><TR><TD WIDTH="5%" NOWRAP><FONT SIZE="-1">コード:</FONT></TD><TD WIDTH="95%"><HR SIZE="1" WIDTH="100%"></TD></TR><TR><TD COLSPAN="2"><PRE>
Dim liOldSelect As ListItem

For Each liOldSelect In DropDownList1.Items
If (liOldSelect.Selected) Then
liOldSelect.Selected = False
End If
Next

DropDownList1.Items.FindByValue("value3").Selected = True
</PRE><HR SIZE="1" WIDTH="100%"></TD></TR></TABLE><!-- BBCode End -->

もっとスマートな方法があるかもしれません。
ご存知の方、フォローお願いしますm(__)m

# 一歩違いでしたね(^^;
# cats氏、当方も早速参考にさせて頂きました。ありがとうございます。


[ メッセージ編集済み 編集者: はぐれコ〜ギ〜 編集日時 2003-07-28 17:52 ]
ハヤ
常連さん
会議室デビュー日: 2003/06/04
投稿数: 41
投稿日時: 2003-07-28 19:01
cats様、はぐれコ〜ギ〜様、回答ありがとうございます。
お二方の方法で試してみたところ、きちんとできました。
ありがとうございます。

コード:
//cats様の方法。OK
this.DropDownList1.SelectedIndex = -1;

//はぐれコ〜ギ〜様の方法。OK
foreach(ListItem li in this.DropDownList1.Items)
{
  li.Selected = false;
}

this.DropDownList1.Items.FindByValue("value3").Selected = true;  //OKになりました



>はぐれコ〜ギ〜様
>Page_Load時に一度選択済アイテム(value2)を設定していますので、
>ボタンクリック時にそれを解除していないと既に選択しているアイ
>テムが存在すると認識するようです。
なるほど、理解しました。PostBack時にDropDownListの値は、Mr.ADO.NET様が
「プログラミングASP.NET第2回の記事について(
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=1318&forum=7)
」で述べられているとおり、IPostBackDataHandlerにて復元されるわけですね?

この自動状態管理処理でPostBack前の状態に戻す処理はどこか目で確認できる
ものなのでしょうか?
マシュー
常連さん
会議室デビュー日: 2002/11/29
投稿数: 39
投稿日時: 2004-08-31 18:55
古いものを引っ張りだして申し訳ありませんが同内容?で困っております
ご教授ください。

複数のドロップダウンを並べているのですが。

//--------------------------------------------------------------
this.DropDownList1.SelectedIndex = -1;
this.DropDownList1.Items.FindByValue("value1").Selected = true;

this.DropDownList2.SelectedIndex = -1;
this.DropDownList2.Items.FindByValue("value2").Selected = true;

this.DropDownList3.SelectedIndex = -1;
this.DropDownList3.Items.FindByValue("value3").Selected = true;
//-------------------------------------------------------------

としますが、「DropDownList には複数の項目を選択できません」のエラーになってしまいます。
よろしくお願いします。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2004-08-31 19:49
.Items.FindByValue("value1").Selected = true;

この記述はListBoxの複数選択モードで使いますが、DropDownListは複数選択できませんので
使うのは変です。

DropDownList1.SelectedValue = "value1";

とすればよいです。
1

スキルアップ/キャリアアップ(JOB@IT)