none
自己参照型テーブルを使って、comboboxを作成したい RRS feed

  • 質問

  • Windowsアプリケーションの開発をVisual Studio2005、SQL server、C#を使って行っています。

    C#はほとんど分からない素人です。

     

    テーブルPersonには、parent(int型)というカラムがあり、

    このカラムは自分の親を参照するためのものです。

    例えば、

    ID  name     parent

    1    山田太郎   2

    2   田中花子   null

    3    鈴木二郎   null

    4    佐藤三郎    3

    5  山田和子    3

    とすると、山田太郎さんの親は田中花子さんだということが分かります。

    親より上の存在はないので、

    parentの値がnullのPersonテーブルのnameを

    コンボボックスであらわしたいのですが、

    どうdataBindingすればいいのかが、わかりません。

    クエリの追加でSQLを発行するのだろうとは思うのですが、

    アドバイス等いただけたらと思います。

    よろしくお願い致します。

     

     

    2012年1月12日 13:04

回答

  • 参考してください

    Sample Code:

     

     string connStr = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
            private void Form1_Load(object sender, EventArgs e)
            {
                SqlConnection conn = new SqlConnection(this.connStr);
                SqlCommand cmd = new SqlCommand("Select ID,name from Person Where parent IS NULL", conn);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                da.Fill(ds);
                comboBox1.DisplayMember = "name";
                comboBox1.ValueMember = "ID";
                comboBox1.DataSource = ds.Tables[0];
                conn.Close();
            }
    

    Result:

     

     

     



    • 編集済み Shadow .Net 2012年1月12日 14:14
    • 回答としてマーク tanaka0011 2012年1月15日 1:42
    2012年1月12日 14:13
  • たぶん、ほとんどの人が質問者さんが何をしたいのか理解でき
    ないと思います。

    テーブル Person をどのように取得して何に表示したいのです
    か?

    また、このスレッドの質問だけ回答が得られても、最終的にや
    りたいことが実現できなくては意味がないのでは?

    前のスレッドを見ると、テーブルが 3 つあるとのことだったの
    ですが、それは考えなくてもいいのですか?

    同じく前のスレッドでは更新もしたいとのことですが、それは
    どのようにしたいのですか?

    現実的に何ができて何ができないのか理解して、自分の力量で
    どこまでできるか見通しを立てて質問しないと、掲示板で解決
    するのは難しいですよ。

    素人という言葉を免罪符にしないで、よく考えて十分な情報を
    提供してください。

     

    • 回答としてマーク tanaka0011 2012年1月15日 1:42
    2012年1月12日 14:25
  • 既にサンプルコードが提示されているようなので質問方法についてちょっと書いておきます。

    素人と言う言葉は便利な言葉なんですけれど、こういう掲示板では意味がない言葉です。
    なぜなら、素人と言う言葉からは有効な情報が得られないからです。
    たとえば、C#の文法の入門書は一通り読みましたとか、簡単なコンソールプログラムなら
    何本か組んだ事があります。とかなら情報として有効なんですが、素人と言う言葉からは
    具体的に何が出来るのかがさっぱり分からないからです。

    書かれている内容から推察すると文法に関しては一通りやっているだろうくらいは思いつきますが、
    これはあくまでも掲示板を読んでいる側の想像で実際には全く違っているかもしれません。
    掲示板はあくまでも文字によるやり取りになりますから自分に取っては当たり前の事が
    文字しないと伝わってきません。ですから、詳しすぎるのではと思うくらい状況説明をしても
    実際には情報としてまだ足りないケースが殆どです。
    掲示板で説明する時はめんどくさくても状況説明をたっぷりするようにしてください。
    あと、スレッドが変わると読み手も変わっている可能性があります。
    基本的にスレッドが変わったら必要な背景は再度説明を行った方が無難です。
    前のスレッドを参照出来るようにする手もあると思いますが、その辺はご自身の判断にお任せします。


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答としてマーク tanaka0011 2012年1月15日 1:42
    2012年1月13日 2:18
  • クエリの追加でSQLを発行するのだろうとは思うのですが、

    アドバイス等いただけたらと思います。

    と、書かれていますので、おそらくTableAdapterを使用されているのだと思います。コンボボックスへのバインドの仕方は既に回答が出ていますので、ここではTableAdapterについて書きます。
    どのようにTableAdapterを構成するか(作成するか)については、お察しの通り、親のみを抽出するクエリを追加すれば良いでしょう。そのSQL文は既に、Shadow And Happy Codeさんが書かれている通りです。この辺りのTableAdapterの構成については、以下を参考にして下さい。

    7.6 データコンポーネント機能によるデータアクセスコンポーネントの開発
    D. テーブルアダプタへのクエリ追加
    http://www.atmarkit.co.jp/fdotnet/bookpreview/vs2005webapp_07/vs2005webapp_07_03.html

    さて、若干のアドバイスですが、nullを使わなければならないという状況以外では、安易にnullを使わない方が後々の処理が楽になります。簡単に言えばnullは特殊な値になりますので、数字などの通常の値と同様に扱えないからです。例えばSQLのwhere句でも、比較の際に=ではなくisを使わなければなりませんし、C#でもnullを許容しない型などについて注意する必要があります。ですから、ここでは例えば、親の場合はnullではなく0にすることを検討されると良いと思います。特に初心者の方にはやさしくなるはずです。

    #みなさんもいろいろ書かれていますが、それらに加えて、「わからない」だけではなく、「どこまではわかっている」という情報を付加するようにして下さい。そうすれば無駄な説明をしなくて済みますので、ポイントを絞った的確なアドバイスを行いやすくなり、効率的に解決へ近づくことができます。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2012年1月13日 5:02
    モデレータ

すべての返信

  • 参考してください

    Sample Code:

     

     string connStr = ConfigurationManager.ConnectionStrings["myConnectionString"].ConnectionString;
            private void Form1_Load(object sender, EventArgs e)
            {
                SqlConnection conn = new SqlConnection(this.connStr);
                SqlCommand cmd = new SqlCommand("Select ID,name from Person Where parent IS NULL", conn);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                da.Fill(ds);
                comboBox1.DisplayMember = "name";
                comboBox1.ValueMember = "ID";
                comboBox1.DataSource = ds.Tables[0];
                conn.Close();
            }
    

    Result:

     

     

     



    • 編集済み Shadow .Net 2012年1月12日 14:14
    • 回答としてマーク tanaka0011 2012年1月15日 1:42
    2012年1月12日 14:13
  • たぶん、ほとんどの人が質問者さんが何をしたいのか理解でき
    ないと思います。

    テーブル Person をどのように取得して何に表示したいのです
    か?

    また、このスレッドの質問だけ回答が得られても、最終的にや
    りたいことが実現できなくては意味がないのでは?

    前のスレッドを見ると、テーブルが 3 つあるとのことだったの
    ですが、それは考えなくてもいいのですか?

    同じく前のスレッドでは更新もしたいとのことですが、それは
    どのようにしたいのですか?

    現実的に何ができて何ができないのか理解して、自分の力量で
    どこまでできるか見通しを立てて質問しないと、掲示板で解決
    するのは難しいですよ。

    素人という言葉を免罪符にしないで、よく考えて十分な情報を
    提供してください。

     

    • 回答としてマーク tanaka0011 2012年1月15日 1:42
    2012年1月12日 14:25
  • 既にサンプルコードが提示されているようなので質問方法についてちょっと書いておきます。

    素人と言う言葉は便利な言葉なんですけれど、こういう掲示板では意味がない言葉です。
    なぜなら、素人と言う言葉からは有効な情報が得られないからです。
    たとえば、C#の文法の入門書は一通り読みましたとか、簡単なコンソールプログラムなら
    何本か組んだ事があります。とかなら情報として有効なんですが、素人と言う言葉からは
    具体的に何が出来るのかがさっぱり分からないからです。

    書かれている内容から推察すると文法に関しては一通りやっているだろうくらいは思いつきますが、
    これはあくまでも掲示板を読んでいる側の想像で実際には全く違っているかもしれません。
    掲示板はあくまでも文字によるやり取りになりますから自分に取っては当たり前の事が
    文字しないと伝わってきません。ですから、詳しすぎるのではと思うくらい状況説明をしても
    実際には情報としてまだ足りないケースが殆どです。
    掲示板で説明する時はめんどくさくても状況説明をたっぷりするようにしてください。
    あと、スレッドが変わると読み手も変わっている可能性があります。
    基本的にスレッドが変わったら必要な背景は再度説明を行った方が無難です。
    前のスレッドを参照出来るようにする手もあると思いますが、その辺はご自身の判断にお任せします。


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答としてマーク tanaka0011 2012年1月15日 1:42
    2012年1月13日 2:18
  • クエリの追加でSQLを発行するのだろうとは思うのですが、

    アドバイス等いただけたらと思います。

    と、書かれていますので、おそらくTableAdapterを使用されているのだと思います。コンボボックスへのバインドの仕方は既に回答が出ていますので、ここではTableAdapterについて書きます。
    どのようにTableAdapterを構成するか(作成するか)については、お察しの通り、親のみを抽出するクエリを追加すれば良いでしょう。そのSQL文は既に、Shadow And Happy Codeさんが書かれている通りです。この辺りのTableAdapterの構成については、以下を参考にして下さい。

    7.6 データコンポーネント機能によるデータアクセスコンポーネントの開発
    D. テーブルアダプタへのクエリ追加
    http://www.atmarkit.co.jp/fdotnet/bookpreview/vs2005webapp_07/vs2005webapp_07_03.html

    さて、若干のアドバイスですが、nullを使わなければならないという状況以外では、安易にnullを使わない方が後々の処理が楽になります。簡単に言えばnullは特殊な値になりますので、数字などの通常の値と同様に扱えないからです。例えばSQLのwhere句でも、比較の際に=ではなくisを使わなければなりませんし、C#でもnullを許容しない型などについて注意する必要があります。ですから、ここでは例えば、親の場合はnullではなく0にすることを検討されると良いと思います。特に初心者の方にはやさしくなるはずです。

    #みなさんもいろいろ書かれていますが、それらに加えて、「わからない」だけではなく、「どこまではわかっている」という情報を付加するようにして下さい。そうすれば無駄な説明をしなくて済みますので、ポイントを絞った的確なアドバイスを行いやすくなり、効率的に解決へ近づくことができます。

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2012年1月13日 5:02
    モデレータ
  • 返信ありがとうございます。また、返信が遅れてしまい申し訳ありません。

    質問の仕方についてのアドバイスありがとうございます。

    自分のプログラム能力がどの程度か具体的に示すことをせず、安易に「素人」という言葉を使っていました。

    以後はきちんと自分がどこまで理解できているのか、きちんと記入いたします。

     

    質問内容についてですが、TableAdapterを使って、取得、コンボボックスに表示したかったのです。

    なので、Shadow And Happy Codeさんのコードを参考にさせて頂きました。

    また、Trapemiyaさんの意見、参考URLも参考にさせて頂き、parentにはdefaultで0を入れるように変更しました。

     

    返信くださった皆さんありがとうございました。

    2012年1月15日 1:42