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

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

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

Re[3]: DataTableの中身をConboBoxに表示したい


(過去ログ 96 を表示中)

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

■57376 / inTopicNo.1)  DataTableの中身をConboBoxに表示したい
  
□投稿者/ はる (1回)-(2011/02/24(Thu) 15:59:45)

分類:[C#] 

2011/02/24(Thu) 16:00:41 編集(投稿者)

こんにちは

Windows XP
Visual Studio 2010
C#
PostgreSQL
で開発しています。

staffというテーブルの
staff_codeを全てコンボボックスの
Itemにしたいです。

class A
{
private conbo_set()
{
DataTable b_dt;

B b = new B();
b_dt = b.GetStaffData();
}
}

class B
{
public DataTable GetStaffData()
{
string command = "select staff_code from staff ";
DataSet ds = this.ExecuteSQL(command);
if ((ds != null) && (ds.Tables[TABLE_NAME].Rows.Count > 0))
{
return ds.Tables[TABLE_NAME];
}
return null;
}
}
DataTableを上記のように
メソッドにして
呼び出し元で取得したDataTableから
コンボボックスに表示したいのですが
DataTableの中身の取得の仕方がわかりません…

b_dt.Tables[TABLE_NAME].Rows[1]["staff_code"].ToString();
このようにすると、ひとつだけ取得できました。
これをループで回せば!と思ったのですが、
終了条件がわかりません…。
ちなみに、staff_codeはいくつあるかわかりません。
Lengthとかもなかったのでわからなくて…。

調べても調べ方が悪いのか
全くわからなかったので
わかる方がいらっしゃいましたら
よろしくお願いいたします。
引用返信 編集キー/
■57377 / inTopicNo.2)  Re[1]: DataTableの中身をConboBoxに表示したい
□投稿者/ shu (473回)-(2011/02/24(Thu) 16:14:50)
No57376 (はる さん) に返信

ComboBoxのDataSourceに取得したDataTableを設定して
DisplayMemberに"staff_code", ValueMemberにも"staff_code"を
設定すれば良いかと思います。


DataTableの行数は DataTable.Rows.Countで取得出来ます。
またforeachを使用すればCountを取得することなく、全行を処理出来ます。

引用返信 編集キー/
■57378 / inTopicNo.3)  Re[1]: DataTableの中身をConboBoxに表示したい
□投稿者/ 魔界の仮面弁士 (2096回)-(2011/02/24(Thu) 16:15:00)
No57376 (はる さん) に返信
>    private conbo_set()
               _
private void combo_set()  ……ではなく?
               ~

> staffというテーブルの
> staff_codeを全てコンボボックスの
> Itemにしたいです。

下記のようにしてみてください。
 comboBox1.DataSource = ds.Tables[テーブル名];
 comboBox1.DisplayMember = "staff_code";  // 画面に表示される項目
 comboBox1.ValueMember = "staff_code";    // comboBox1.SelectedValue で返される項目

この場合、
 comboBox1.Items[番号] → DataRowView 型のオブジェクト
 comboBox1.SelectedItem → DataRowView 型のオブジェクト
 comboBox1.SelectedValue → staff_code の値
のようになります。

引用返信 編集キー/
■57380 / inTopicNo.4)  Re[2]: DataTableの中身をConboBoxに表示したい
□投稿者/ はる (2回)-(2011/02/24(Thu) 16:31:48)
No57377 (shu さん) に返信
> ■No57376 (はる さん) に返信
>
> ComboBoxのDataSourceに取得したDataTableを設定して
> DisplayMemberに"staff_code", ValueMemberにも"staff_code"を
> 設定すれば良いかと思います。
>
>
> DataTableの行数は DataTable.Rows.Countで取得出来ます。
> またforeachを使用すればCountを取得することなく、全行を処理出来ます。
>

foreachの使い方は知りませんでした…
まだまだ初心者なので
勉強しないといけません…

ありがとうございました!!
引用返信 編集キー/
■57381 / inTopicNo.5)  Re[2]: DataTableの中身をConboBoxに表示したい
□投稿者/ はる (3回)-(2011/02/24(Thu) 16:33:12)
No57378 (魔界の仮面弁士 さん) に返信
> ■No57376 (はる さん) に返信
>> private conbo_set()
> _
> private void combo_set() ……ではなく?
> ~
すみません記載ミスです;

>>staffというテーブルの
>>staff_codeを全てコンボボックスの
>>Itemにしたいです。
>
> 下記のようにしてみてください。
>  comboBox1.DataSource = ds.Tables[テーブル名];
>  comboBox1.DisplayMember = "staff_code"; // 画面に表示される項目
>  comboBox1.ValueMember = "staff_code"; // comboBox1.SelectedValue で返される項目
>
> この場合、
>  comboBox1.Items[番号] → DataRowView 型のオブジェクト
>  comboBox1.SelectedItem → DataRowView 型のオブジェクト
>  comboBox1.SelectedValue → staff_code の値
> のようになります。

ありがとうございました!
無事考えているとおりに表示させることができました。

またなにかあればよろしくお願いいたします。
解決済み
引用返信 編集キー/
■57383 / inTopicNo.6)  Re[3]: DataTableの中身をConboBoxに表示したい
□投稿者/ 魔界の仮面弁士 (2097回)-(2011/02/24(Thu) 16:49:59)
# shu さんと被った。(^^;

■No57376 (はる さん) に返信
> b_dt.Tables[TABLE_NAME].Rows[1]["staff_code"].ToString();
> このようにすると、ひとつだけ取得できました。

その記述だと、b_dt が DataSet 型であるかのように見えますが、

> DataTable b_dt;
> B b = new B();
> b_dt = b.GetStaffData();

こちらでは、b_dt は「DataTable」になっていますね。


> これをループで回せば!と思ったのですが、
> 終了条件がわかりません…。
> ちなみに、staff_codeはいくつあるかわかりません。
> Lengthとかもなかったのでわからなくて…。

行数を調べる方法は、既にご存知のはずですよ。
ご自身で .Rows.Count を用いたコードを書いておられるのですから。

>  if ((ds != null) && (ds.Tables[TABLE_NAME].Rows.Count > 0))

という事は、終了条件が分からないというより、ループ文の書き方そのものが分からなかったという事でしょうか。


■No57380 (はる さん) に返信
>>DataTableの行数は DataTable.Rows.Countで取得出来ます。
>>またforeachを使用すればCountを取得することなく、全行を処理出来ます。
> foreachの使い方は知りませんでした…
> まだまだ初心者なので
> 勉強しないといけません…

shu さんが書かれた「foreach」を使う場合は、
    comboBox1.BeginUpdate();
    foreach (DataRow row in b_dt.Rows)
    {
        comboBox1.Items.Add(row["staff_code"]);
    }
    comboBox1.EndUpdate();
のようにします。b_dt は DataTable です。
BeginUpdate / EndUpdate の行は無くても動きますが、書いておいた方が処理効率が向上します。


「for」を使う場合は、こんな感じです。
    comboBox1.BeginUpdate();
    for (int r = 0; rowIndex < b_dt.Rows.Count; rowIndex++)
    {
        comboBox1.Items.Add(b_dt.Rows[r]["staff_code"]);
    }
    comboBox1.EndUpdate();


「while」を使う手もあります。
    comboBox1.BeginUpdate();
    int rowIndex = 0;
    while (rowIndex < b_dt.Rows.Count)
    {
        comboBox1.Items.Add(b_dt.Rows[rowIndex]["staff_code"]);
        rowIndex++;
    }
    comboBox1.EndUpdate();


Linq を使って一行で登録する事も出来ます。
   comboBox1.Items.AddRange(b_dt.AsEnumerable().Select(r => r["staff_code"]).ToArray());

.Items.Add を繰り返し使って登録する場合は、BeginUpdate / EndUpdate を呼び出した方が良いですが、
.Items.AddRange を使って一括登録する場合は、BeginUpdate / EndUpdate の呼び出しは不要です。

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


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

このトピックに書きこむ

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

管理者用

- Child Tree -