none
LISTBOX 指定行の非表示 RRS feed

  • 質問

  • 環境:C#2005

     

    お世話になります。

    リストボックスまたはそれに代わるもの(LISTVIEWなど)で

    指定の行だけ非表示って出来るのでしょうか

     

    やりたいことはListBoxにAddやRemoveを繰り返すのですが

    1.表示以外の情報を持っている 下記URL(VB6で言うItemData相当のもの)

    2.隠しデータ(ItemData)にて常にソートをする必要がある

    そのため、addをするたびに、一旦Listboxからデータを取得し

    自作ソートクラスでソートさせたものを、Listboxへaddしなおすイメージを考えています。

    (※removeは考慮不要ですね)

     

    もし非表示が出来るなら、addされるものをあらかじめ全て登録しておき

    必要に応じて表示・非表示にして、見た目上のadd、removeを行えたらと

    考えました。

    ⇒必要に応じ、表示されているものだけを処理する

     

    <ListBox および ComboBox コントロールに ItemData プロパティが存在しない VB版>

    http://support.microsoft.com/default.aspx?scid=kb;ja;311340

     

    是非、ご教示の程よろしくお願いいたします。

     

    ※ちなみに列は非表示に出来るようです。

    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=24005&forum=7
    2008年11月17日 14:26

回答

すべての返信

  • 書かれている要件だとDataTableにデータを入れておき、そこからフィルタとソートを行ったDataViewを作成し、それをListBoxなどにバインドしてしまえば済むような気がしますが、この方法はいかがでしょうか?

    2008年11月17日 15:05
    モデレータ
  • trapemiyaさん

     

    ご回答ありがとうございます。

    大変お手数ですが、なにかサンプルソースか、URLでも

    あれば助かります。

     

    もう少しお付き合い願えませんでしょうか
    2008年11月18日 3:52
  • DataTableを作成する例は以下にあります。

     

    DataRow クラス
    http://msdn.microsoft.com/ja-jp/library/system.data.datarow.aspx

     

    DataTableからDataViewを作成する例は以下にあります。

     

    DataView コンストラクタ (DataTable, String, String, DataViewRowState)
    http://msdn.microsoft.com/ja-jp/library/8sd1cd0a(VS.80).aspx

     

    もしくは、DataViewのSortやRowFilterプロパティを利用します。

     

    あとはこのDataViewをListBoxのDataSourceを利用してバインドして下さい。

    2008年11月18日 4:09
    モデレータ
  • 度々ありがとうございます。

    こんな感じで実装できました。

     

    ・商品と金額と表示フラグを持ったDataTableを作成し、ソート(金額)&表示フラグ=trueだけをlistboxへ表示

    ・ボタンクリックイベントで対象データ(いちご)を表示・非表示切り替え

     

            // DataTable作成(IDと商品と金額と表示フラグ)
            private DataTable table = new DataTable("ListBoxShow");

            private void Form1_Load(object sender, EventArgs e)
            {           
                // カラム作成(ID)
                DataColumn idColumn = new DataColumn();
                idColumn.DataType = System.Type.GetType("System.Int32");
                idColumn.ColumnName = "Id";
                idColumn.AutoIncrement = true;
                table.Columns.Add(idColumn);
                // カラム作成(商品)
                DataColumn itemColumn = new DataColumn();
                itemColumn.DataType = System.Type.GetType("System.String");
                itemColumn.ColumnName = "Item";
                table.Columns.Add(itemColumn);
                // カラム作成(金額)
                DataColumn costColumn = new DataColumn();
                costColumn.DataType = System.Type.GetType("System.Int32");
                costColumn.ColumnName = "Cost";
                table.Columns.Add(costColumn);
                // カラム作成(表示フラグ)
                DataColumn showColumn = new DataColumn();
                showColumn.DataType = System.Type.GetType("System.Boolean");
                showColumn.ColumnName = "ShowData";
                table.Columns.Add(showColumn);

     

                // データ行作成・追加
                DataRow row;
                row = table.NewRow();
                row["Item"] = "りんご";
                row["Cost"] = "100";
                row["ShowData"] = true;
                table.Rows.Add(row);

                row = table.NewRow();
                row["Item"] = "みかん";
                row["Cost"] = "50";
                row["ShowData"] = true;
                table.Rows.Add(row);

                row = table.NewRow();
                row["Item"] = "いちご";
                row["Cost"] = "30";
                row["ShowData"] = false;
                table.Rows.Add(row);

     

                // DataView作成
                DataView dv = new DataView(table);
                // フィルタかける
                dv.RowFilter = "ShowData = true";
                // ソートする
                dv.Sort = "Cost ASC";

     

                // ListBoxにDataViewを紐付け
                listBox1.DataSource = dv;
                listBox1.DisplayMember = "Item";    // ListBox表示内容
                listBox1.ValueMember = "Id";        // SelectdValueでの取得値
            }

            private void button1_Click(object sender, EventArgs e)
            {
                // もし「いちご」が表示なら非表示、非表示なら表示に
                DataRow[] foundRows = table.Select("Item = 'いちご'");
                DataRow dr = foundRows[0];
                if ((bool)dr["ShowData"])
                {
                    dr["ShowData"] = false;
                }
                else
                {
                    dr["ShowData"] = true;
                }
     

    2008年11月18日 15:32