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

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

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

Re[4]: FlowLayoutPanel内コントロールの順序の設定


(過去ログ 99 を表示中)

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

■59242 / inTopicNo.1)  FlowLayoutPanel内コントロールの順序の設定
  
□投稿者/ ゆる (1回)-(2011/05/19(Thu) 21:40:57)

分類:[C#] 

FlowLayoutPanelに、条件に応じてテキストボックスを配置しています。
動的に追加や削除することは出来ているのですが、単純に追加すると最後に追加されます。
これをテキストボックスの表示されている内容の順に表示したいのですが、少々てこずっています。

例)
FlowLayoutPanelに、
A1、B1、B2、C1、C2
というテキストのテキストボックス(コントロール名は別のものが指定されています)
が並んでいるところに「B3」と「A2」を単純に追加すると、
A1、B1、B2、C1、C2、B3、A2
となるが、これを
A1、A2、B1、B2、B3、C1、C2
となるようにしたい。


Controls.SetChildIndexメソッドを用いて順序を変更できるところまでは理解できたのですが、
FlowLayoutPanel内のコントロールに対して、テキスト順にIndexを設定する上手い方法が思い浮かびません。

コントロール名とテキストをdatatableなどに格納して、テキスト順に並べ替えて順にIndexを指定…
という方法くらいしか思いつかず、なんだか非効率な気がしています。

アドバイス頂ければ幸いです。
どうかよろしくお願いします。


引用返信 編集キー/
■59244 / inTopicNo.2)  Re[1]: FlowLayoutPanel内コントロールの順序の設定
□投稿者/ shu (701回)-(2011/05/19(Thu) 22:10:33)
No59242 (ゆる さん) に返信

A1、A2、B1、B2、B3、C1、C2
> となるようにしたい。
この順にデザインで並べておいて、visibleを変更するのは駄目ですか?
デザイン時ならドラッグで調整出来ますよ。
引用返信 編集キー/
■59247 / inTopicNo.3)  Re[2]: FlowLayoutPanel内コントロールの順序の設定
□投稿者/ ゆる (2回)-(2011/05/19(Thu) 22:36:07)
shuさま
ありがとうございます。

実際にFlowLayoutPanelに貼り付けたいテキストの内容はマスタで別に管理していて、1000件以上になる場合があります。
また、貼り付ける対象の条件も任意に変更されます。

上記のような状況につき予めデザインしておくのが難しく、
条件に応じて動的にテキストボックスを配置するようにしたいのです…。


引用返信 編集キー/
■59249 / inTopicNo.4)  Re[3]: FlowLayoutPanel内コントロールの順序の設定
□投稿者/ shu (705回)-(2011/05/19(Thu) 23:30:51)
No59247 (ゆる さん) に返信

> 実際にFlowLayoutPanelに貼り付けたいテキストの内容はマスタで別に管理していて、1000件以上になる場合があります。
> また、貼り付ける対象の条件も任意に変更されます。
1000件もあるならFlowLayoutPanelは使用しないで通常のPanel上に計算して配置した方が効率がいい気がします。
1000件というのは一覧形式で同じ項目がずらずら並んでいるのでしょうか?だとすると画面に表示できる分だけ配置し
スクロールバーでもつけてデータ表示を切り替えるというのも手です。


FlowLayoutPanelを使用する方法であれば
> コントロール名とテキストをdatatableなどに格納して、テキスト順に並べ替えて順にIndexを指定…
> という方法くらいしか思いつかず、なんだか非効率な気がしています
この方法自体妥当な方法だと思います。
引用返信 編集キー/
■59250 / inTopicNo.5)  Re[3]: FlowLayoutPanel内コントロールの順序の設定
□投稿者/ ザーサイ (1回)-(2011/05/19(Thu) 23:32:20)
No59247 (ゆる さん) に返信

FlowLayoutPanelへのコントロールの配置は一度きりですか?それとも何かのアクションで追加されますか?
一度きりなら、コントロールをListに入れてコントロールのTextでソートしてFlowLayoutPanelに配置すればいいでしょうし、
後でコントロールが追加になるのであれば、追加時にどこに挿入すればいいかを調べればいいと思います。
引用返信 編集キー/
■59266 / inTopicNo.6)  Re[4]: FlowLayoutPanel内コントロールの順序の設定
□投稿者/ ゆる (4回)-(2011/05/20(Fri) 09:01:21)
shuさま ザーサイさま

ありがとうございます。

今回やりたい要件ではFlowLayoutPanelを使用したく、かつコントロールの配置が適宜追加/削除されるので、
対象のコントロールの一覧を生成してソートしIndexを指定するような方法を取ることにしました。

大変参考になりました。
ありがとうございました。

解決済み
引用返信 編集キー/
■59288 / inTopicNo.7)  Re[4]: FlowLayoutPanel内コントロールの順序の設定
□投稿者/ ゆる (5回)-(2011/05/20(Fri) 13:41:41)
自己レスです。

結局、以下のソースでFlowLayoutPanel内のコントロールの並び替えが実現できました。
ご指南ありがとうございましたm(_ _)m

//FlowLayoutPanel内のコントロールの並び替え(テキストボックスのみ)
        private void FlowLayoutPanelSort()
        {
            try
            {
            DataTable dt = new DataTable();
            dt.Columns.Add("StrText", typeof(string));
            dt.Columns.Add("StrCtrlName", typeof(string));
            dt.Columns.Add("Ctrl", typeof(TextBox));


            //flp_01に設定されているテキストボックスをdtに格納
            foreach (Control Ctrl in flp_01.Controls)
            {
                if (Ctrl is TextBox)
                {
                    DataRow row = dt.NewRow();
                    row["StrText"] = ((TextBox)Ctrl).Text;
                    row["StrCtrlName"] = ((TextBox)Ctrl).Name;
                    row["Ctrl"] = (TextBox)Ctrl;
                    dt.Rows.Add(row);
                }
            }

            // ソートされたデータビューの作成
            DataView dv = new DataView(dt);
            dv.Sort = "StrText";
            
            //並び順の設定
            int IDx = 0;
            foreach (DataRowView drv in dv)
            {
                flp_01.Controls.SetChildIndex(((TextBox)drv["Ctrl"]), IDx);
                IDx++;
            }

            dt.Dispose();
            dv.Dispose();
            }
            catch (Exception ex)
            {
                //エラー時のメッセージ
            }
        }


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -