トップ回答者
LISTBOX 指定行の非表示

質問
-
環境: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
回答
-
DataTableを作成する例は以下にあります。
DataRow クラス
http://msdn.microsoft.com/ja-jp/library/system.data.datarow.aspxDataTableからDataViewを作成する例は以下にあります。
DataView コンストラクタ (DataTable, String, String, DataViewRowState)
http://msdn.microsoft.com/ja-jp/library/8sd1cd0a(VS.80).aspxもしくは、DataViewのSortやRowFilterプロパティを利用します。
あとはこのDataViewをListBoxのDataSourceを利用してバインドして下さい。
すべての返信
-
DataTableを作成する例は以下にあります。
DataRow クラス
http://msdn.microsoft.com/ja-jp/library/system.data.datarow.aspxDataTableからDataViewを作成する例は以下にあります。
DataView コンストラクタ (DataTable, String, String, DataViewRowState)
http://msdn.microsoft.com/ja-jp/library/8sd1cd0a(VS.80).aspxもしくは、DataViewのSortやRowFilterプロパティを利用します。
あとはこのDataViewをListBoxのDataSourceを利用してバインドして下さい。
-
度々ありがとうございます。
こんな感じで実装できました。
・商品と金額と表示フラグを持った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;
}