- PR -

CheckedListBoxやListBoxのバインディングについて

1
投稿者投稿内容
futa
会議室デビュー日: 2007/03/27
投稿数: 9
投稿日時: 2007-05-29 05:37
CheckedListBoxやListBoxで以下のようなことを行いたいと考えています。

1)リストの表示をTable1からバインドする
2)選択されている位置をTable2からバインドする(複数選択希望)

上記のようなことは可能でしょうか。

よい方法が浮かびません。どなたかよいアイデアを教えていただけないでしょうか。
futa
会議室デビュー日: 2007/03/27
投稿数: 9
投稿日時: 2007-05-29 05:50
環境を書き忘れたので追記します。

VS2005(C#2.0) Windowsアプリケーションです。
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-05-29 08:04
引用:

1)リストの表示をTable1からバインドする
2)選択されている位置をTable2からバインドする(複数選択希望)



日本語の問題だとは思うのですが、
バインドという言葉は通常「ListBox に Table1 をバインドする」のように使います。
そのせいかわかりませんが、どっちにどんな列があって、
どんな風にバインドがしたいのかもよくわかりません。
説明するときは、もう少し具体的にわかりやすく書かないと、読む人には伝わりません。
もう少し具体的な情報をいただけませんか?

例えば

-----------------------------------------------------------------------------
●Table1
  商品コード(numeric)
  商品名(nvarchar)

●Table2
  商品コード(numeric)
  チェック状態(bit)

みたいな感じで、Table1 の商品をリストに表示して、
その商品コードに対応する Table2 のレコードのチェック状態が 1 のもののみ
チェックを入れた状態で表示(バインド)する。
バインドされたデータを、画面で編集し、
最終的にはデータベースに更新する。(Table1, Table2 とも)
-----------------------------------------------------------------------------

一応、私の想像で書きました。
このくらい具体的に書いてください。
環境も書いてくださっているのはいいのですが、DBMSも書きましょう。

また、ListBox, CheckedListBox で可能ですかという質問ですが、
自分でやってみたのですか?
やってみて出来なかったのなら、その情報も付けてください。
futa
会議室デビュー日: 2007/03/27
投稿数: 9
投稿日時: 2007-05-30 05:58
KI様、大変失礼しました。

私の行いたいことをもう少し具体的に説明させていただきます。
Table1
Code Name
---------
1 鈴木
2 佐藤
3 田中

Table2
Code
----------
1
3

上記のようなデータテーブルが2つあります。
Table1はマスタであり、その中から複数選択された主キーのみを
保持しているTable2があるとお考えください。

ここで行いたいことは以下のようなことです。

1.checkedListBoxにTable1をバインドして名前の一覧を表示する
2.そのcheckedListBoxの各行の選択状態に対してTable2をバインドする
(バインドすることで1行目と3行目がチェックされた状態にする)
3.(フォーム上から2行目のみをチェックする)
4.最終的にTable2の状態をデータベースにアップデートする
(その結果Table2はCodeが2の1行のみ存在)

とりあえず簡単なサンプルコードを書きました。

public partial class Form1 : Form
{
DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();
BindingSource bindingSource1 = new BindingSource();
BindingSource bindingSource2 = new BindingSource();

public Form1()
{
InitializeComponent();

dt1.Columns.Add("Code", typeof(int));
dt1.Columns.Add("Name", typeof(string));
bindingSource1.DataSource = dt1;

dt2.Columns.Add("Code", typeof(int));
bindingSource2.DataSource = dt2;
}

private void Form1_Load(object sender, EventArgs e)
{
//dt1にデータを作成
DataRow newRow1 = dt1.NewRow();
newRow1["Code"] = 1;
newRow1["Name"] = "鈴木";
dt1.Rows.Add(newRow1);
newRow1 = dt1.NewRow();
newRow1["Code"] = 2;
newRow1["Name"] = "佐藤";
dt1.Rows.Add(newRow1);
newRow1 = dt1.NewRow();
newRow1["Code"] = 3;
newRow1["Name"] = "田中";
dt1.Rows.Add(newRow1);

//checkedListBox1にdt1をバインドする(一覧表示)
checkedListBox1.DataSource = bindingSource1;
checkedListBox1.DisplayMember = "Name";
checkedListBox1.ValueMember = "Code";

//dt2にデータを作成
DataRow newRow2 = dt2.NewRow();
newRow2["Code"] = 1;
dt2.Rows.Add(newRow2);
newRow2 = dt2.NewRow();
newRow2["Code"] = 3;
dt2.Rows.Add(newRow2);

//checkedListBox1にdt2をバインドする(選択状態)
//下のような趣旨のことを実現したいです
//checkedListBox1.CheckedItems = bindingSource2;

}
}

なお、データベースはSQL Server2005ですが、話を単純にするために
データベースへのアップデートまではとりあえず考えない形で
サンプルを作成いたしました。
KI
大ベテラン
会議室デビュー日: 2007/01/10
投稿数: 239
投稿日時: 2007-05-30 09:24
ありがとうございます。だいぶ状況がわかりました。

CheckedListBox クラス

ここから引用しますが、

引用:

メモ CheckedListBox にはデータをバインドできません。代わりに、ComboBox または ListBox を使用します。



とある通り、CheckedListBox にはバインドできません。
かといって、ListBox にはチェックボックスを表示する機能はありません。
なので、代替案を考えてみました。

(1) CheckedListBox を(バインドせずに)使う
 バインドする代わりに DataSet(DataTable) の情報を元に手動でデータを設定します。
 また、チェック状態が変更されたらそれを DataSet(DataTable) に反映するという作業も必要です。

(2) DataGridView を使う
 もちろん見栄えも変わってしまいますが、標準機能だけで行うならこちらでしょうか。
 (ただし、経験上、DataGridView を使うにはある程度の慣れがいります。)

(3) カスタムコントロールを作成する
 バインド可能な CheckedListBox コントロールを自分で実装する方法です。
 Code Project にそれらしいのはありました。(試していませんが)
 Bindable CheckedListBox (codeproject.com)


なお、複数テーブルからの読み込みについては、
SqlDataAdapter の SelectCommand 内で JOIN する手もありますし、
SQL Server 2005 なら更新可能ビューが作れますので、それを使う手もあると思います。
futa
会議室デビュー日: 2007/03/27
投稿数: 9
投稿日時: 2007-05-31 06:06
KI様、大変参考になりました。
(いろいろな方法があるのですね)
ありがとうございます。

私としては、(2)か(3)の方法でいきたいと思います。
1

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