C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: ASP.NET(4.0) 複数選択可なListBoxにおいて


(過去ログ 128 を表示中)

[トピック内 14 記事 (1 - 14 表示)]  << 0 >>

■76285 / inTopicNo.1)  ASP.NET(4.0) 複数選択可なListBoxにおいて
  
□投稿者/ まー (1回)-(2015/06/20(Sat) 23:56:02)

分類:[ASP.NET (C#)] 


いつもお世話になっております。
掲題の通り、AspのListBoxについて質問させて頂きます。

SelectionMode="Multiple" なListBoxで複数選択を行い、
ボタン押下で選択した項目全ての値表示を試みましたが失敗しました。

調べた結果、選択されている項目のうち、最小Indexのselectedプロパティのみが、trueとなっており、
それ以外の選択した項目ではfalseとなっていました。(3,7,9を選択したが、3のみ選択されていることになっている、という状態です。

どのような原因が考えられるか、よろしければご教授ください。
引用返信 編集キー/
■76286 / inTopicNo.2)  Re[1]: ASP.NET(4.0) 複数選択可なListBoxにおいて
□投稿者/ わくちゃん (12回)-(2015/06/21(Sun) 03:23:17)
No76285 (まー さん) に返信
> 
> いつもお世話になっております。
> 掲題の通り、AspのListBoxについて質問させて頂きます。
> 
> SelectionMode="Multiple" なListBoxで複数選択を行い、
> ボタン押下で選択した項目全ての値表示を試みましたが失敗しました。
> 

> 調べた結果、選択されている項目のうち、最小Indexのselectedプロパティのみが、trueとなっており、
> それ以外の選択した項目ではfalseとなっていました。(3,7,9を選択したが、3のみ選択されていることになっている、という状態です。

これはどのように調べたのですか?

ちなみにSystem.Web.UI.WebControls.ListBoxで要素が選択されているかを判断するには、
ListBox.Itemsの一つ一つの要素(System.Web.UI.WebControls.ListItem)のSelectedプロパティを確認します。

下記のように取得できないですか?

protected void button_Click(object sender, EventArgs e)
{
    List<string> selectedItems = new List<string>();

    foreach (ListItem item in this.listBox1.Items)
    {
        if (item.Selected)
        {
            selectedItems.Add(item.Text);
        }
    }

    this.textBox1.Text = string.Join(",", selectedItems.ToArray());
}


> 
> どのような原因が考えられるか、よろしければご教授ください。


引用返信 編集キー/
■76287 / inTopicNo.3)  Re[2]: ASP.NET(4.0) 複数選択可なListBoxにおいて
□投稿者/ まー (2回)-(2015/06/21(Sun) 04:47:22)

> これはどのように調べたのですか?

VisualStudio2013のデバッグ機能を利用して調べました。
(ブレークポイントを設置し、止まった状態で対象コードにマウスカーソルを当て、階層を下っていって、といった感じです)

> ちなみにSystem.Web.UI.WebControls.ListBoxで要素が選択されているかを判断するには、
> ListBox.Itemsの一つ一つの要素(System.Web.UI.WebControls.ListItem)のSelectedプロパティを確認します。
>
> 下記のように取得できないですか?
>
> protected void button_Click(object sender, EventArgs e)
> {
> List<string> selectedItems = new List<string>();
>
> foreach (ListItem item in this.listBox1.Items)
> {
> if (item.Selected)
> {
> selectedItems.Add(item.Text);
> }
> }
>
> this.textBox1.Text = string.Join(",", selectedItems.ToArray());
> }

はい。出来ませんでした。
複数選択したのち、最小Indexのものしかtrueにならないため、
If文で引っかかるはずのものが引っかかりません
(......ということになる理由がわからないという相談です
引用返信 編集キー/
■76288 / inTopicNo.4)  Re[3]: ASP.NET(4.0) 複数選択可なListBoxにおいて
□投稿者/ まー (3回)-(2015/06/21(Sun) 05:06:47)

参考までにキャプチャを張らせて頂きます。最初からこうすれば良かったですね。すみません。

複数選択時です
http://gyazo.com/ac3272c251dd6864377eaa7b6f24cd3c

その後、ポイントを張ってボタン押下直後で止めました。
選択した項目中、最小値のselectedプロパティはtrueとなっています。
http://gyazo.com/5c5fb8105bf1bc62c46c64addf7536b6

しかし、最小値以外のselectedプロパティはfalseとなっています。
http://gyazo.com/9084bcc8e43d99f1d0f8ba7c10b05520
引用返信 編集キー/
■76289 / inTopicNo.5)  Re[3]: ASP.NET(4.0) 複数選択可なListBoxにおいて
□投稿者/ わくちゃん (13回)-(2015/06/21(Sun) 05:12:22)
No76287 (まー さん) に返信
>
>>これはどのように調べたのですか?
>
> VisualStudio2013のデバッグ機能を利用して調べました。
> (ブレークポイントを設置し、止まった状態で対象コードにマウスカーソルを当て、階層を下っていって、といった感じです)
>
>>ちなみにSystem.Web.UI.WebControls.ListBoxで要素が選択されているかを判断するには、
>>ListBox.Itemsの一つ一つの要素(System.Web.UI.WebControls.ListItem)のSelectedプロパティを確認します。
>>
>>下記のように取得できないですか?
>>
>>protected void button_Click(object sender, EventArgs e)
>>{
>> List<string> selectedItems = new List<string>();
>>
>> foreach (ListItem item in this.listBox1.Items)
>> {
>> if (item.Selected)
>> {
>> selectedItems.Add(item.Text);
>> }
>> }
>>
>> this.textBox1.Text = string.Join(",", selectedItems.ToArray());
>>}
>
> はい。出来ませんでした。
> 複数選択したのち、最小Indexのものしかtrueにならないため、
> If文で引っかかるはずのものが引っかかりません
> (......ということになる理由がわからないという相談です

実際のコードを提示していただけると、別のアドバイスができるかもしれませんが、いかがでしょうか。
引用返信 編集キー/
■76290 / inTopicNo.6)  Re[4]: ASP.NET(4.0) 複数選択可なListBoxにおいて
□投稿者/ まー (4回)-(2015/06/21(Sun) 05:23:52)
> 実際のコードを提示していただけると、別のアドバイスができるかもしれませんが、いかがでしょうか。

>SelectionMode="Multiple" なListBoxで複数選択を行い、
>ボタン押下で選択した項目全ての値表示を試みましたが失敗しました。

これを行った際のコードでしょうか。


@
List<int> selectItems = new List<int>();
for (int i = 0; i < this.cmbOrders.Items.Count; i++)
{
if(this.cmbOrders.Items[i].Selected)
{
selectItems.Add(i);
}
}

A
foreach (ListItem item in ListBox1.Items)
{

if(item.Selected)
{

Message.Text += item.Text + "<br />";

}

以上の二つを試しました。
(AはMSDNのサンプルから引っ張ってきたものですが、コントロールの名前しか変わっておりません

引用返信 編集キー/
■76291 / inTopicNo.7)  Re[4]: ASP.NET(4.0) 複数選択可なListBoxにおいて
□投稿者/ わくちゃん (14回)-(2015/06/21(Sun) 05:38:11)
No76290 (まー さん) に返信
> > 実際のコードを提示していただけると、別のアドバイスができるかもしれませんが、いかがでしょうか。
>
> >SelectionMode="Multiple" なListBoxで複数選択を行い、
> >ボタン押下で選択した項目全ての値表示を試みましたが失敗しました。
>
> これを行った際のコードでしょうか。
>
>
> @
> List<int> selectItems = new List<int>();
> for (int i = 0; i < this.cmbOrders.Items.Count; i++)
> {
> if(this.cmbOrders.Items[i].Selected)
> {
> selectItems.Add(i);
> }
> }
>
> A
> foreach (ListItem item in ListBox1.Items)
> {
>
> if(item.Selected)
> {
>
> Message.Text += item.Text + "<br />";
>
> }
>
> 以上の二つを試しました。
> (AはMSDNのサンプルから引っ張ってきたものですが、コントロールの名前しか変わっておりません
>

うーん。問題なさそうですね。
.aspx側はどのようになっていますか?

引用返信 編集キー/
■76292 / inTopicNo.8)  Re[5]: ASP.NET(4.0) 複数選択可なListBoxにおいて
□投稿者/ まー (5回)-(2015/06/21(Sun) 06:39:46)

> うーん。問題なさそうですね。
> .aspx側はどのようになっていますか?

対象ListBox
<asp:ListBox ID="cmbOrders" runat="server" Width="80px" DataSourceID="SqlDataSource2" DataTextField="XX" SelectionMode="Multiple" Height="183px"></asp:ListBox>
対象?ボタン
<asp:Button ID="btn_inputCommand" runat="server" Text="コマンド入力" Width="189px" Height="25px" OnClick="btn_inputCommand_Click" />

このボタンを押下すると、対象Listの選択情報を得るロジックがあるbtn_inputCommand_Clickが発動する感じです。
これでよろしいでしょうか?(ListBoxなのにcmbとはこれいかに......
引用返信 編集キー/
■76293 / inTopicNo.9)  Re[1]: ASP.NET(4.0) 複数選択可なListBoxにおいて
□投稿者/ WebSurfer (605回)-(2015/06/21(Sun) 09:31:57)
No76285 (まー さん) に返信

> どのような原因が考えられるか、よろしければご教授ください。

質問者さんのコードで何故ダメなのかは見ていませんが、以下
の記事に書いてあるようにすればできるはずです。ご自分のコ
ードと較べてみてください。

リストボックスのスクロール位置を維持
http://surferonwww.info/BlogEngine/post/2011/11/20/Maintain-scroll-top-of-list-box-before-and-after-postback.aspx

スクロール位置を維持するための余計な JavaScript のコード
がありますがそこは無視してください。

ASP.NET 3.5 ですが ASP.NET 4 でも動くはずです。

別ページにデモ(「実験室」というリンクを張ってます)もあ
りますので見てください。

引用返信 編集キー/
■76294 / inTopicNo.10)  Re[2]: ASP.NET(4.0) 複数選択可なListBoxにおいて
□投稿者/ まー (6回)-(2015/06/21(Sun) 14:45:38)
2015/06/21(Sun) 14:49:41 編集(投稿者)

> 質問者さんのコードで何故ダメなのかは見ていませんが、以下
> の記事に書いてあるようにすればできるはずです。ご自分のコ
> ードと較べてみてください。
>
> リストボックスのスクロール位置を維持
> http://surferonwww.info/BlogEngine/post/2011/11/20/Maintain-scroll-top-of-list-box-before-and-after-postback.aspx
>
> スクロール位置を維持するための余計な JavaScript のコード
> がありますがそこは無視してください。
>
> ASP.NET 3.5 ですが ASP.NET 4 でも動くはずです。
>
> 別ページにデモ(「実験室」というリンクを張ってます)もあ
> りますので見てください。


ありがとうございました。リンク先のページを参考にテストした結果、以下の事実が判明しました。

1.問題の起きている対象aspxにリンク先のソースをそのまま貼り付けて実行した結果、
問題無く複数選択値を取得出来た(使用したボタンコントロールはリンク先と元々あるもの両方です

2.リンク先ソースのリストボックスに、本トピックNo.8にある
「DataSourceID="SqlDataSource2" DataTextField="XX" 」
を追加した所、複数選択値が出来なくなった(精確にいえば、でたらめに見える結果が返されるようになった

なおこのデータソースの中身は以下の通りです。
<asp:SqlDataSource
ID="SqlDataSource2"
runat="server"
ConnectionString="<%$ ConnectionStrings:ZZ %>"
SelectCommand="XX"
SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:SessionParameter Name="session" SessionField="AA" Type="String" />    
</SelectParameters>
</asp:SqlDataSource>


なぜデータソースの有無でselectedがでたらめに変化するのか、現在も引き続き調べております。

調査方法や、こうじゃないかという説がありましたら、ご指導のほど宜しくお願いします.......
引用返信 編集キー/
■76295 / inTopicNo.11)  Re[3]: ASP.NET(4.0) 複数選択可なListBoxにおいて
□投稿者/ わくちゃん (15回)-(2015/06/21(Sun) 15:51:24)
2015/06/21(Sun) 15:55:43 編集(投稿者)
2015/06/21(Sun) 15:53:18 編集(投稿者)
2015/06/21(Sun) 15:53:14 編集(投稿者)
No76294 (まー さん) に返信
> 2015/06/21(Sun) 14:49:41 編集(投稿者)
> なぜデータソースの有無でselectedがでたらめに変化するのか、現在も引き続き調べております。
>
> 調査方法や、こうじゃないかという説がありましたら、ご指導のほど宜しくお願いします.......

当方でもいろいろ調べてみました。(時間かかっちゃったな・・・。)


確信はありませんが、ListItemのValueがユニークでないと前述の動作が起きるようです。

たとえば、下記のような場合、
<asp:ListBox runat="server" ID="listBox1" SelectionMode="Multiple" Width="100" >
<asp:ListItem Value="あ" >あ</asp:ListItem>
<asp:ListItem Value="い" >い</asp:ListItem>
<asp:ListItem Value="う" >う</asp:ListItem>
<asp:ListItem Value="え" >え</asp:ListItem>
<asp:ListItem Value="お" >お</asp:ListItem>
</asp:ListBox>
これは複数選択が問題なく動作します。

ですが、下記のような場合、
<asp:ListBox runat="server" ID="listBox1" SelectionMode="Multiple" Width="100" >
<asp:ListItem Value="あ" >あ</asp:ListItem>
<asp:ListItem Value="い" >い</asp:ListItem>
<asp:ListItem Value="あ" >う</asp:ListItem> //←valueを「あ」にした
<asp:ListItem Value="え" >え</asp:ListItem>
<asp:ListItem Value="お" >お</asp:ListItem>
</asp:ListBox>
同一のValueを持った値を選択すると、同一のvalueのうち、先頭のIndexのListItemのみがSelected=trueとなることがわかりました。

つまり、
「あ、い、え」を選択してボタンを押すと正常に動作します。
「あ、い、う」を選択してボタンを押すと「あ、い」のみがSelected=tureとなります。「う」のvalueが「あ」で同一のため


まーさんのListBoxの中身もValueがユニークでない値が含まれていますので、同じ現象が起こっているのだと考えられます。
SqlDataSourceでDB内のユニークな項目を一緒に取得し、ListBoxのDataValueFieldに設定すると、おそらく問題は解決されるのではないかと思います。


確信はありません。試してみてください。



追記

ちなみに、Valueがユニークであれば、Textがすべて同じでも正常に動作することも確認しています。
<asp:ListBox runat="server" ID="listBox1" SelectionMode="Multiple" Width="100" >
<asp:ListItem Value="あ" >あ</asp:ListItem>
<asp:ListItem Value="い" >あ</asp:ListItem>
<asp:ListItem Value="う" >あ</asp:ListItem>
<asp:ListItem Value="え" >あ</asp:ListItem>
<asp:ListItem Value="お" >あ</asp:ListItem>
</asp:ListBox>
これはOK。
引用返信 編集キー/
■76296 / inTopicNo.12)  Re[4]: ASP.NET(4.0) 複数選択可なListBoxにおいて
□投稿者/ まー (7回)-(2015/06/21(Sun) 16:18:03)
> 当方でもいろいろ調べてみました。(時間かかっちゃったな・・・。)
>
>
> 確信はありませんが、ListItemのValueがユニークでないと前述の動作が起きるようです。
>
> たとえば、下記のような場合、
> <asp:ListBox runat="server" ID="listBox1" SelectionMode="Multiple" Width="100" >
> <asp:ListItem Value="あ" >あ</asp:ListItem>
> <asp:ListItem Value="い" >い</asp:ListItem>
> <asp:ListItem Value="う" >う</asp:ListItem>
> <asp:ListItem Value="え" >え</asp:ListItem>
> <asp:ListItem Value="お" >お</asp:ListItem>
> </asp:ListBox>
> これは複数選択が問題なく動作します。
>
> ですが、下記のような場合、
> <asp:ListBox runat="server" ID="listBox1" SelectionMode="Multiple" Width="100" >
> <asp:ListItem Value="あ" >あ</asp:ListItem>
> <asp:ListItem Value="い" >い</asp:ListItem>
> <asp:ListItem Value="あ" >う</asp:ListItem> //←valueを「あ」にした
> <asp:ListItem Value="え" >え</asp:ListItem>
> <asp:ListItem Value="お" >お</asp:ListItem>
> </asp:ListBox>
> 同一のValueを持った値を選択すると、同一のvalueのうち、先頭のIndexのListItemのみがSelected=trueとなることがわかりました。
>
> つまり、
> 「あ、い、え」を選択してボタンを押すと正常に動作します。
> 「あ、い、う」を選択してボタンを押すと「あ、い」のみがSelected=tureとなります。「う」のvalueが「あ」で同一のため
>
>
> まーさんのListBoxの中身もValueがユニークでない値が含まれていますので、同じ現象が起こっているのだと考えられます。
> SqlDataSourceでDB内のユニークな項目を一緒に取得し、ListBoxのDataValueFieldに設定すると、おそらく問題は解決されるのではないかと思います。
>
>
> 確信はありません。試してみてください。
>
>
>
> 追記
>
> ちなみに、Valueがユニークであれば、Textがすべて同じでも正常に動作することも確認しています。
> <asp:ListBox runat="server" ID="listBox1" SelectionMode="Multiple" Width="100" >
> <asp:ListItem Value="あ" >あ</asp:ListItem>
> <asp:ListItem Value="い" >あ</asp:ListItem>
> <asp:ListItem Value="う" >あ</asp:ListItem>
> <asp:ListItem Value="え" >あ</asp:ListItem>
> <asp:ListItem Value="お" >あ</asp:ListItem>
> </asp:ListBox>
> これはOK。


ありがとうございます!!!!!!!!
解決しました!!!!!!!!!!!!!!!!
ストアドが駄目なのかなーとか色々考えてたんですが........あーーそういう........あーーーーーー
(listBoxの挙動ですか。検索の仕方が駄目だったのか、その辺りの情報が全くありませんでした......

わくちゃん様 WebSurfer様 本当にありがとうございました!!!
解決済み
引用返信 編集キー/
■76297 / inTopicNo.13)  Re[3]: ASP.NET(4.0) 複数選択可なListBoxにおいて
□投稿者/ WebSurfer (606回)-(2015/06/21(Sun) 16:44:46)
No76294 (まー さん) に返信

> なおこのデータソースの中身は以下の通りです。
> <asp:SqlDataSource
> ID="SqlDataSource2"
> runat="server"
> ConnectionString="<%$ ConnectionStrings:ZZ %>"
> SelectCommand="XX"
> SelectCommandType="StoredProcedure">
> <SelectParameters>
> <asp:SessionParameter Name="session" SessionField="AA" Type="String" />    
> </SelectParameters>
> </asp:SqlDataSource>

SqlDataSource で何が取得されるかは回答者には見えないので、そのあたり
の情報をきちんと提供してもらわないとピンポイントで回答するのは難しい
のですが・・・わくちゃんさんが努力してくださったようで、たぶんわくち
ゃんさんの指摘が当たっていると思います。

ASP.NET がレンダリングした HTML ソースを見て、わくちゃんさんの指摘さ
れたことを確認してください。

引用返信 編集キー/
■76298 / inTopicNo.14)  Re[5]: ASP.NET(4.0) 複数選択可なListBoxにおいて
□投稿者/ WebSurfer (607回)-(2015/06/21(Sun) 16:55:33)
No76296 (まー さん) に返信

すみません、レスが前後して解決済みマークが外れてしまいました。

ついでに、

> (listBoxの挙動ですか。検索の仕方が駄目だったのか、その辺りの情報が全くありませんでした......

ListBox の挙動というわけではなく、ListBox は <select name="ListBox1" multiple="multiple" ...
という HTML にレンダリングされますが、ブラウザでアイテムを選択して submit したとき、どういう情
報がサーバーに送信されるかというもっとプリミティブなところです。

興味があれば IE の F12 開発者ツールや Fiddler2 などでブラウザと Web サーバーのやり取りをキャプ
チャして中身を見るといいと思います。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -